07. Zapamiętywanie stanu aplikacji - część II

07. Zapamiętywanie stanu aplikacji - część II

Autor: Piotr Gaszewski

Opublikowano: 1/13/2006, 12:00 AM

Liczba odsłon: 53363

W poprzednim rozdziale opisałem, w jaki sposób aplikacja internetowa może zapamiętywać dane, wykorzystując obiekty sesji i aplikacji. Nie są to jednak jedyne sposoby zapamiętywania stanu aplikacji ASP.NET. W rozdziale tym przyjrzymy się kilku kolejnym sposobom.

Jedną z najprostszych metod przekazywania danych między stronami, wchodzącymi w skład naszej aplikacji, jest zapisanie danych w adresie internetowym. Zapewnie często w czasie surfowania po sieci, spotykaliście się z adresami zakończonymi znakiem zapytania, za następnie dość tajemniczo wyglądającymi ciągami znaków. W ten sposób, wykorzystując adres widziany w przeglądarce internetowej, możemy przekazać informacje z jednej podstrony na drugą. Adres tego typu może przedstawiać się następująco:

http://mojaStronaInternetowa.com/index.aspx?mojaZmienna=WartoscZmiennej.

Wyobraźmy sobie sytuację, w której musimy przekazać wartość podawaną przez użytkownika (na przykład poprzez wpisanie do TextBoxa) z jednej formatki na drugą. Wykorzystując opisaną wyżej metodę (Query String), możemy tego dokonać w następujący sposób:

  • na pierwszej ze stron umieszczamy pole tekstowe oraz przycisk, po naciśnięciu, którego wywoływana będzie całkowicie nowa formatka.
  • kod obsługi przycisku przedstawiał się będzie następująco:

protected void Button1_Click(object sender, EventArgs e)
{
    this.Response.Redirect("Default.aspx?PodanyTekst=" + this.TextBox1.Text);
}

  • natomiast metoda Page_Load na stronie Default.aspx, zawierać będzie następujący kod:

protected void Page_Load(object sender, EventArgs e)
{
    this.Label1.Text = "Podany tekst to: " + this.Request.QueryString["PodanyTekst"];
}

Pierwsza strona, na której znajdziemy się po uruchomieniu programu, przedstawiać się będzie następująco:

Natomiast strona Default.aspx. na którą nastąpi przekierowanie po naciśnięciu przycisku zawierać będzie następujące informacje:

Zawarte w adresie informacje, odczytujemy na stronie Default.aspx, dzięki właściwości QueryString obiektu Request. W tym miejscu proszę zwrócić uwagę na pasek adresu w przeglądarce. Widzimy, że wszystkie dane, przekazywane w ten sposób, zapisane są jawnie w adresie i są widoczne dla każdego, na przykład dla złośliwego dzieciaka, zaglądającego nam przez ramię w kafejce internetowej. Metoda ta, dlatego nie nadaje się do przekazywania danych poufnych, takich jak: loginy, hasła, numery kart kredytowych itp.

@STRONA@

Innym sposobem przekazywania informacji między stronami jest użycie obiektu PreviousPage. Wykorzystując go, możemy odczytać właściwości kontrolek, znajdujących się na stronie, z której aktualna formatka została wywołana. Modyfikujemy w tym celu kod naciśnięcia przycisku w następujący sposób:

protected void Button1_Click(object sender, EventArgs e)
{
    this.Server.Transfer("Default.aspx");
}

Uwaga. W przypadku zastosowania metody Response.Redirect, jak w poprzednim przypadku, odczytanie własności formatek na wywoływanej stronie nie będzie możliwe.
Zmieniamy również zawartość metody Page_Load, na stronie Default.asxp.

protected void Page_Load(object sender, EventArgs e)
{
    TextBox txt = (TextBox)PreviousPage.FindControl("TextBox1");
    this.Label1.Text = "Podany tekst to: " + txt.Text;
}

Efekt działania aplikacji po naciśnięciu przycisku, będzie identyczny jak w poprzednim przypadku.

Zmienne w obrębie formatki możemy przechowywać wykorzystując jej właściwość o nazwie: ViewState. Dane te przechowywane są na stronie w formie zaszyfrowanej i przekazywane są między klientem a serwerem podczas przeładowań strony. Klikając na stronie w oknie przeglądarki prawym przyciskiem myszy i wybierając opcję: "Pokaż źródło strony" możemy odnaleźć wspomniany ciąg. Ponieważ ViewState przechowuje dane na stronie, jego zastosowanie ograniczone jest w dużym stopniu do obiektów, które mogą być poddawane procesowi serializacji. Wszelkie bardziej skomplikowane obiekty muszą być najpierw sprowadzone do postaci łańcucha tekstowego.

Zapisywanie i odczytywanie zmiennych z ViewState-a przedstawia się następująco:

ViewState["wartość"] = "zapamiętana wartość";
string zmienna = ViewState["wartosc"];

Ostatnim sposobem, który zamierzam omówić jest zapamiętywanie stanu aplikacji po stronie klienta. Wykorzystamy do tego celu obiekty Cookie, czyli popularne ciasteczka. Dane zapisywane są w tym przypadku w plikach tekstowych na dysku twardym komputera użytkownika aplikacji. Wadą tego rozwiązania jest to, że użytkownik może zablokować wykorzystywanie "ciasteczek" w swojej przeglądarce. Wówczas część funkcjonalności aplikacji sieciowej może być dla niego niedostępna. Dlatego najpierw zawsze warto sprawdzić, czy przeglądarka klienta obsługuje Cookie. Odbywa się to w następujący sposób:

protected void Page_Load(object sender, EventArgs e)
{
   
if (this.Request.Browser.Cookies)
    {
        HttpCookie cookie = new HttpCookie("myCookie");
        cookie.Value = "Piotrek";
       
this.Response.Cookies.Add(cookie);
   
}
    else
   
{
        this.Response.Write("Przegladarka nie obsługuje ciastek!!!");
    }
}

Tak wygląda natomiast odczytanie wartości, zapamiętanej w naszym ciasteczku: 

if (this.Request.Cookies["myCookie"] != null)
{
   
this.Response.Write("Nazywas sie: " + (string)this.Request.Cookies["myCookie"].Value);
}

Używając pojedynczego ciasteczka, zapamiętać możemy wartości wielu zmiennych.

if (this.Request.Browser.Cookies)
{
    HttpCookie cookie = new HttpCookie("myCookie");
    cookie.Values["FirstName"]= "Piotrek";
    cookie.Values["LastName"]= "Gaszewski";
    this.Response.Cookies.Add(cookie);
}


if
(this.Request.Browser.Cookies)
{
   
if (this.Request.Cookies["myCookie"] != null)
    {
        HttpCookie cookie = this.Request.Cookies["myCookie"];
        string FirstName = (string)cookie.Values["FirstName"];
        string LastName = (string)cookie.Values["LastName"];
       
this.Response.Write("Nazywasz sie: " + FirstName + " " + LastName);
   
}
}

Ciasteczka mają również wiele innych interesujących właściwości. Przykładowo tworząc nowy obiekt tego typu możemy ustawić jego właściwość o nazwie Cookie.Expired. Robimy to w następujący sposób: 

HttpCookie cookie = new HttpCookie("myCookie");
cookie.Expired = DateTime.Today.AddDays(1);

Ważność ciasteczka, o nazwie myCookie zakończy się w tym przypadku po upływie jednego dnia. Ciasteczka, których data ważności już wygasła są niszczone przez aplikację klienta. W ten prosty sposób możemy ograniczyć czas przechowywania na dysku twardym użytkownika określonych informacji.

Jak wykorzystać Copilot w codziennej pracy? Kurs w przedsprzedaży
Jak wykorzystać Copilot w codziennej pracy? Kurs w przedsprzedaży

Wydarzenia