Nu skrev Nicolai jo ganske rigtig, at der ikke renderes noget til __VIEWSTATE i eksemplerne skrevet i trin1 af denne ViewState quiz, men det er jo en smule sært er det ikke?!?

Hvis vi kigger på implementeringen af .Text på en TextBox, ser den sådan her ud:

public virtual void set_Text(string value) { this.ViewState["Text"] = value; }

ViewState er altså backend for bemeldte property, hvilket vil sige, at .Text ALTID skrives til ViewState, men det renderes IKKE til __VIEWSTATE - Hva' fa'en er nu det for noget kludder?!?

Well... hele idéen med denne quiz er sådan set, at vi skal have afkludret det, og finde ud af hvad det er der foregår, og hvad det kan være rart at være bekendt når man arbejder med diverse ASP.NET kontroller.

At TextBox'ens indhold kan findes i ens formscollection (som Nicolai skrev) er selvfølgelig helt korrekt, men det medfører ikke at det er uinteressant at gemme indholdet af .Text i __VIEWSTATE, for hele pointen er, at det der ligger i __VIEWSTATE er det der viser hvordan verden så ud da siden blev renderet, og ikke hvordan verden ser ud når siden rammer serveren igen (hvor indholdet jo kan læses direkte i input-felterne) - og hvornår er det overhovedet interessant... Altså både at kende initialværdien (fra __VIEWSTATE->ViewState), og den nuværende værdi (fra formscollection)?

Det kan det være i flere situationer, så her kommer en udvidelse af de tidligere viste eksempler som vil vise én af dem.

1)
Følgende markup:

<asp:TextBox ID="t0" runat="server" Text="En masse tekst" OnTextChanged="t0_TextChanged"></asp:TextBox>

2)
Følgende markup:

<asp:TextBox ID="t1" runat="server"></asp:TextBox>

Og følgende kode:

protected void Page_Load(object sender, EventArgs e) { t1.Text = "En masse tekst"; t1.TextChanged += new EventHandler(t1_TextChanged);' }

3)

Følgende kode: 

protected void Page_Load(object sender, EventArgs e) { t2.Text = "En masse tekst"; } protected override void OnInit(EventArgs e) { base.OnInit(e); t2 = new TextBox(); t2.ID = "t2"; t2.TextChanged += new EventHandler(t2_TextChanged); form1.Controls.Add(t2); }

4)
Følgende kode:

protected void Page_Load(object sender, EventArgs e) { TextBox t3 = new TextBox(); t3.ID = "t3"; t3.Text = "En masse tekst"; t3.TextChanged += new EventHandler(t3_TextChanged); form1.Controls.Add(t3); }

5)
Følgende kode:

protected void Page_Load(object sender, EventArgs e) { TextBox t4 = new TextBox(); t4.ID = "t4"; form1.Controls.Add(t4); t4.TextChanged += new EventHandler(t4_TextChanged); t4.Text = "En masse tekst"; }

Et eller andet sted giver det en vis grad af mening, at det at man abbonnerer på hændelsen at indholdet i en TextBox ændrer sig, medfører et rimeligt behov for at kende både initialtilstanden, og den nuværende tilstand. Hvis der ikke abbonneres på hændelsen, er der faktisk ingen grund til nogensinde at gemme initialtilstanden i __VIEWSTATE - kun den aktuelle værdi er interessant, og det er noget som TextBox'en selv står for.

Som der blev skrevet om i "sidste afsnit" kalder frameworket SaveViewState på kontrollerne i kontroltræet inden siden renderes. SaveViewState er en virtuel metode på Control-klassen, og en TextBox har sin egen implementering som følger:

protected override object SaveViewState() { if (!this.SaveTextViewState) { // implementeringen her kommer vi til senere } kald til basen } private bool SaveTextViewState { get { if (this.TextMode == TextBoxMode.Password) { return false; } if (((base.Events[EventTextChanged] == null) && base.IsEnabled) && ((this.Visible && !this.ReadOnly) && (base.GetType() == typeof(TextBox)))) { return false; } return true; } }

Læg mærke til at der bl.a. spørges på
base.Events[EventTextChanged] == null
Hvilket vil være tilfældet hvis der ikke er abbonneret på TextBox'en TextChanged-event, hvilket så altså resulterer i at .Text ikke skrives til __VIEWSTATE.

Men nu et par spørgsmål til :o)

1)
Når nu vi på alle TextBox'e har abbonneret på TextChanged... Vil de så alle få renderet .Text til __VIEWSTATE?
Og hvis ikke - hvilke vil så IKKE ske for?

2)
Hvis teksten ændres i alle TextBox'e, og der sker et postback, vil det så ændre hvilke TextBoxe der får renderet .Text til __VIEWSTATE?

3)
Vil 4 og 5 opføre sig forskelligt? Og i givet fald - hvorfor?

Mvh
Jeppe