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.