2007-01-30

Asp.Net ViewState

Här är en bra artikel som förklarar ViewState i Asp.Net.
http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx


Det mest intressanta:
  • De flesta kontroller sparar sina properties i ett fält som heter ViewState.
  • Initialt håller kontrollen inte koll på förändringar i ViewState.
  • Efter det att en kontroll har börjat att hålla koll på sitt ViewState, eller spåra förändringar av ViewState (dålig översättning av tracking ViewState) så kommer ändrade properties att markeras som dirty. Det är endast dessa properties som kommer att serialiseras ner till det dolda __VIEWSTATE fältet.
  • En kontroll börjar spåra förändringar av ViewState efter sin OnInit.
  • Sidans OnInit anropas efter alla kontollers, så vid det laget så spårar alla kontroller förändringar av sina ViewState.
  • Data som binds under sidans OnInit och OnLoad, t.ex. i Page_Load, kommer att serialiseras och skickas till klienten i __VIEWSTATE, eftersom kontrollerna spårar förändringar av ViewState. Detta innebär; Sätt inte properties på kontroller efter sidans OnInit om du inte vill att det ska hamna i __VIEWSTATE.
  • Properties på kontroller som sätts under sidans OnPreInit, dvs. innan kontrollerna börjat spåra förändringar av ViewState, kommer inte att hamna i __VIEWSTATE. Detta kan utnyttjas till att fylla kontroller med data som är billigt och enkelt att hämta vid varje postback, istället för att roundtrippa datat via klienten.
  • När du skapar kontroller via kod, t.ex. i metoden CreateChildControls i en custom control eller CompositeControl) så se till att sätta alla defaultvärden för properties innan du lägger till kontrollen i Controls .
    Innan du lägger till den så svävar kontrollen så att säga fritt i luften. Den känner inte till något om omvärlden och och "ingen" har fått den att börja spåra förändringar av ViewState. Efter det att du lagt till den i Controls finns det risk att kontrollen direkt efter Add-anropet kommer börja spåra förändringar (en kontroll som skapas sent i en sidan lifscykel får nämligen springa ikapp övriga kontroller och kommer därför direkt att raskt knata igenom alla events och så).

Inga kommentarer: