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.