fbpx
devstyle.pl - Blog dla każdego programisty
devstyle.pl - Blog dla każdego programisty
2 minut

Wstrzykiwanie informacji do HTML w Nancy


07.10.2013

Wpadłem na pomysł rozwiązania pewnego dręczącego mnie problemu (o którym pewnie wkrótce) w aplikacji webowej. Pomysł ten polega na wstrzyknięciu informacji o aktualnym użytkowniku w postaci JSON do HTMLa zwracanego do przeglądarki. Ot, po prostu żeby strona kliencka wiedziała z kim ma do czynienia.

Aplikacja ta powstaje w Nancy – bardzo eleganckim frameworku, o którym chyba kiedyś wspomniałem, ale też którego nigdy w technicznym poście nie poruszyłem.

W Nancy rozwiązanie problemu jest całkiem proste. Cała konfiguracja aplikacji znajduje się w klasie Bootstraper. Nancy dostarcza nam kilka standardowych bootstraperów, a żeby osiągnąć pożądaną funkcjonalność – wystarczy nadpisać “najbardziej standardowy” z nich, czyli DefaultNancyBootstrapper.

O tak:

public class CustomBootstrapper : DefaultNancyBootstrapper
{
    protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
    {
        pipelines.AfterRequest.AddItemToEndOfPipeline(new PipelineItem<Action<NancyContext>>(
            "Injecting user info into a non-ajax, authenticated response",
            ctx =>
            {
                if (ctx.CurrentUser == null || ctx.IsAjaxRequest())
                {
                    return;
                }

                var str = new MemoryStream();
                ctx.Response.Contents.Invoke(str);
                string originalOutput = Encoding.UTF8.GetString(str.GetBuffer());

                int endOfBody = originalOutput.LastIndexOf("</body>");
                if (endOfBody > 0)
                {
                    var userInfo = ctx.CurrentUser.DumpClientSideInfo();
                    string json = new JavaScriptSerializer().Serialize(userInfo);

                    ctx.Response.Contents = s =>
                    {
                        string modifiedOutput = originalOutput.Insert(endOfBody, @"<script>
var currentUser = ({0})
</script>".FormatWith(json));

                        var writer = new StreamWriter(s, Encoding.UTF8) {AutoFlush = true};
                        writer.Write(modifiedOutput);
                    };
                }
            }));
    }
}

Da się to rozwiązać jakoś bardziej elegancko, obiektowo, i w ogóle, ale…

Nie przegap kolejnych postów!

Dołącz do ponad 9000 programistów w devstyle newsletter!

Zapisując się na newsletter zgadzasz się na przetwarzanie Twoich danych osobowych w celu wysyłania na wskazany przez Ciebie adres e-mail informacji handlowych o nowościach, promocjach, produktach i usługach związanych z serwisem devstyle.pl. Będzie to marketing bezpośredni, do realizacji którego wykorzystam Twoje telekomunikacyjne urządzenia końcowe. Administratorem Twoich danych osobowych będzie Maciej Aniserowicz prowadzący działalność gospodarczą w Białymstoku (15-215) przy ul. Konopnickiej 14/8, NIP 5422824401. Przysługuje Tobie prawo do cofnięcia zgody, żądania wglądu do Twoich danych, wniesienia sprzeciwu co do ich przetwarzania, sprostowania, usunięcia i ograniczenia przetwarzania. Więcej informacji o tym jak przetwarzam Twoje dane znajdziesz na devstyle.pl/RODO. Powered by ConvertKit
Notify of
siararadek
siararadek

Ja podobną rzecz napisałem do MVC żeby wstrzykiwać dane do Angulara. Sporo o Nancy słyszę i chyba następny mój projekt w tym powstanie :)

trackback

Wstrzykiwanie informacji do HTML w Nancy | Maciej Aniserowicz o programowaniu…

Dziękujemy za dodanie artykułu – Trackback z dotnetomaniak.pl…

Scooletz

Hej,
zmieniłbym dwie rzeczy: pierwsza to serializator (JSON.NET is good). Druga to to, że aby dokleić na koniec fragment tekstu, cała odpowiedź jest wczytywana do pamięci, potem LastIndexOf… trochę to cięzkie. Zastanawiałeś się nad sekcją i dorzuceniem tego w Layoutcie (Razor)?

Bartek
Bartek

Jako niedoświadczony w aplikacjach webpowych zastanawiam się nad wykorzystaniem tego pomysłu i tak na szybko przyszło mi na myśl dostosowywanie aplikacji web po stronie klienta w zależności od użytkownika, np. z wykorzystaniem KnockoutJS lub Angulara. Mam rację?

Łukasz

ogólnie takie wstrzykiwanie informacji do html’a jest bardzo wartościowe! np. bootstrapData w google docs. często widzę aplikacje, które na onload zaczynają bombardować serwer po jakieś informacje. a zwykle można je “wkleić” do htmla.

Kurs Gita

Zaawansowany frontend

Szkolenie z Testów

Szkolenie z baz danych

Facebook

Książka

Zobacz również