UWAGA! Promocja dla firm - MICROSOFT OFFICE 365  na 12 miesiecy ZA DARMO! Tylko na CentrumXP.pl!
Wielka promocja Office 365 na CentrumXP.pl!
Do góry Skomentuj

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

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

Autor: Piotr Gaszewski Opublikowano: 13 stycznia 2006 Odsłon: 36 048

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.

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.

Zobacz również

Komentarze

Hi. Tutaj znajduje się pełna lista metod zapamiętywania stanu aplikacji wraz z ich wadami i zaletami: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/diforwc-ch06.asp
Friki, 6 czerwca 2006, 14:32
O - fatalna pomyłka... Jeszcze raz: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/DIforWC-CH05.asp
Friki, 8 czerwca 2006, 11:05
zamiast cookie.Expired powinno byc cookie.Expires
k1b1c, 18 czerwca 2006, 14:25
Pytanko - w którym miejscu w drzewie katalogów przechowywane jest to ciacho? Wszystko działa, a wyszukiwarka systemowa nie może znależć niczego o podobnej nazwie na dysku. Inne ciacha są, ale to stworzone przeze mnie nie chce się odnaleźć :/
m010ch, 25 czerwca 2006, 13:26
sory ale nie wiadomo o co chodzi w pierwszej olowie tekstu. Gdzie wpisac poszczegolne instrukcje itp. TextBox1 umeiszczam wedlug instrukcji na stronie na stronie pierwszej czyli domyslnie jest nia Default.aspx logicznie rzecz biorac. Ale na screenie widze ze jest to Default2.aspx no wiec rovie drugie podejscie i na drugiej umieszczam kod... blad oczywiscie chodzi o label1 ktorego nie wrzucilismy i teraz pytanie gdzie go wrzucic? musi byc tam gdzie kod buttona i innych. Ale wtedy wpisany tekst pojawia sie na tej samej stonie i nie wiem gdzie ma pojawic sie ta nowa strona.... ehh wiele betonow DO POPRAWY
s0d, 23 marca 2008, 14:52
Cosik mi się wydaje że w metodzie przekazującej zmienną po adresie powinno być "Default2.aspx?PodanyTekst=" a nie


"Default.aspx?PodanyTekst="


zakładając oczywiście że druga formatka nazywa się Default2
No chyba że bymi się coś pokręciło...

Ben, 14 listopada 2008, 10:16
@ Ben
jest dobrze tylko druga formatka to Default.

harri, 21 stycznia 2009, 09:35

Dodaj swój komentarz

Zasady publikacji komentarzyZasady publikacji komentarzy

Redakcja CentrumXP.pl nie odpowiada za treść komentarzy publikowanych na stronach Portalu
i zastrzega sobie prawo do usuwania wypowiedzi, które:

  • zawierają słowa wulgarne, obraźliwe, prowokujące i inne naruszające dobre obyczaje;
  • są jedynie próbami reklamowania stron internetowych (spamowanie poprzez umieszczanie linków);
  • przyczyniają się do złamania prawa bądź warunków licencyjnych oprogramowania (cracki, seriale, torrenty itp.);
  • zawierają dane osobowe, teleadresowe, adresy mailowe lub numery GG;
  • merytorycznie nie wnoszą nic do dyskusji lub nie mają związku z tematem komentowanego newsa, artykułu bądź pliku.

Autor:

Komentarz:

Dodaj komentarz