ASP.NET: View state – podstawy

 

Kolejny post dotyczący podstaw ASP.NET. Tym razem przyszedł czas na omówienie mechanizmu, jakim jest View state. Mechanizm ten jest wykorzystywany do przechowywania informacji, które muszą być podtrzymane pomiędzy kolejnymi postbackami. Informacja o przechowywanych danych jest zawarta w jednym lub więcej polach ukrytych (hidden fields) dołączanych do kodu html strony. Warto podkreślić, że View state przeznaczony jest wyłącznie do przechowywania danych zawartych na tej samej stronie. W przypadku, gdy dane muszą być dostępne przy przechodzeniu pomiędzy stronami, konieczne jest skorzystanie z innego mechanizmu, jak np. omawianego przeze mnie już Session state.

Informacje można przechowywać wykorzystując właściwość ViewState dla strony. Właściwość ta udostępnia słownik, zatem dane są identyfikowane poprzez pary klucz-wartość. Co do typów możliwych do przechowywania wymienić można: String, Integer, Boolean itd. Po spis wszystkich możliwości odsyłam do materiału źródłowego http://msdn.microsoft.com/en-us/library/bb386448(v=VS.90).aspx 

Przede wszystkim, chcąc przechowywać dane za pomocą View state, należy zadbać o to, aby w kodzie znalazł się formularz (form) z atrybutem runat=”server”. W przypadku Visual Web Developer 2010 Express formularz taki tworzony jest wraz ze standardowo dostępną stroną główną (Site.Master), a więc nie musimy pamiętać, aby tworzyć go osobno dla każdej ze stron. Z racji tego, że dane w View state są przechowywane poprzez ukryte pola wszelkie zmiany mogą być dokonywane jedynie do czasu wystąpienia zdarzenia PreRenderComplete. Gdy strona zostanie wyrenderowana dokonywanie zmian nie jest już możliwe.

Przykładowy kod wykorzystujący View state:

private string storedTemperature = null;
        
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        //Populate RadioButtonList with proper values
        string[] arr = new string[] { "F", "C" };

        ListItem[] myList = new ListItem[arr.Length];

        for (int i = 0; i < myList.Length; i++)
        {
            //ListItem with text and value properties
            myList[i] = new ListItem(arr[i], arr[i]);
        }

        RadioButtonList1.Items.AddRange(myList);
        RadioButtonList1.AutoPostBack = true;
    }
    else
    {
        ViewState["temperature"] = RadioButtonList1.SelectedValue;
    }
    
    if (ViewState["temperature"] != null)
    {
        storedTemperature = (string)ViewState["temperature"];
        Label1.Text = storedTemperature;
    }
}
W powyższym kodzie przedstawiony został wycinek klasy strony. W momencie kiedy nie występuje PostBack, czyli gdy strona jest wczytywana po raz pierwszy, tworzony jest kontrolka RadioButtonList. Wypełniana ona jest ciągami znakowymi umożliwiającymi wybór na stronie pomiędzy wyświetlaniem temperatury w stopniach Fahrenheita i Celsjusza. Ustawienie właściwości AutoPostBack na true powoduje, że PostBack jest automatycznie wykonywany po wyborze jednej z opcji (nie jest to zachowanie domyślne). Dane do View state można zapisywać podobnie jak pokazałem to dla Session state, czyli poprzez odwołanie do indeksu. Przypisanie wybranej wartości następuje w momencie, gdy stwierdzone zostanie wystąpienie PostBack. Bez znaczenia czy nastąpił PostBack, czy też nie (kod napisany w ten sposób tylko dla demonstracji sposobu sprawdzenia istnienia zmiennej), sprawdzana jest zawartość View state dla odpowiedniej zmiennej. Jeśli zmienna posiada przypisaną wartość to jest ona odczytywana i przypisywana kontrolce Label. Po odczycie zmiennej z View state konieczne jest oczywiście zastosowanie rzutowania.
 
W View state można również przechowywać własne obiekty, z tym jednak zastrzeżeniem, że klasa musi posiadać atrybut [Serializable()]. W przeciwnym przypadku otrzymywany po uruchomieniu aplikacji jest komunikat w stylu: “Type ‚ShoppingApp.Person’ in Assembly ‚ShoppingApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null’ is not marked as serializable.” Biorąc zatem za przykład utworzoną w jednym z poprzednich postów klasę Person, powinna ona wyglądać następująco:
 
[Serializable()]
    public partial class Person
    {
        protected string firstName;
        protected string lastName;
        ...
    }
}
W tym momencie można przechowywać w View state obiekty własnej klasy:
 
protected void Page_PreRender(object sender, EventArgs e)
{
  Person p = new Person("Walt", "Kowalsky");
  ViewState["Person"] = p;
}
Odczyt następuje w taki sam sposób jak dla pokazanej wcześniej zmiennej temperature.
Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d blogerów lubi to: