Letzte Woche habe ich einen Artikel geschrieben: „Wo wird der Wert der Control-ViewState-Eigenschaft gespeichert?“ Darin wurde erklärt, dass auf Control.ViewState letztendlich über die beiden Methoden Control.SaveViewState und Control.LoadViewState zugegriffen wird. Der Artikel enthält einen Satz, der Sie möglicherweise verwirrt: „Wenn wir this.ViewState[key] zum Lesen und Schreiben nach OnInit verwenden, ist diese Eigenschaft wahr“, wobei sich „diese Eigenschaft“ auf StateItem.IsDirty bezieht. Warum ist die IsDirty-Eigenschaft nach OnInit immer wahr? Nachdem ich auf „TRULY Understanding ViewState“ verwiesen hatte, wurde mir endlich klar, dass dies nicht immer der Fall ist. Bitte hören Sie mir zu, wie ich die detaillierten Gründe erläutere.
Das erste, was Sie sich ansehen müssen, ist die Methode StateBag.TrackViewState. Diese Methode wird aufgerufen, wenn das Steuerelement OnInit beginnt, Änderungen in StateItem zu verfolgen . . Das heißt, vor OnInit ist die IsDirty-Eigenschaft falsch, und unabhängig davon, wie Sie den Wert der Value-Eigenschaft festlegen, wird die IsDirty-Eigenschaft nicht geändert. Nach OnInit bleibt die Eigenschaft „IsDirty“ ebenfalls „false“, bis Sie den Wert der Eigenschaft „Value“ zum ersten Mal ändern (bezogen auf die Änderung durch die Methode „this.ViewState[key]“). In der SaveViewState-Phase werden nur StateItems gespeichert, deren IsDirty-Attribut „true“ ist.
Warum ist es so konzipiert? Beispielsweise wird der deklarativ definierten Text-Eigenschaft eines Labels in ASPX ein Anfangswert zugewiesen, und der Anfangswert wird dann natürlich über ViewState["Text"] beibehalten. Im nächsten Seitenlebenszyklus lädt die Text-Eigenschaft dieses Labels zunächst den deklarativ in ASPX während OnInit definierten Anfangswert und überschreibt ihn dann mit ViewState["Text"], der während LoadViewState aus ViewState gelesen wird. Sofern Sie die Text-Eigenschaft im vorherigen Seitenlebenszyklus jedoch nicht programmgesteuert geändert haben, ist ViewState["Text"] immer noch der Anfangswert. Sie verwenden also ViewState["Text"], um den Anfangswert zu speichern und den deklarativ definierten Anfangswert zu überschreiben. Es ist völlig sinnlos, denselben Wert auf diese Weise zu überschreiben, und außerdem wird ViewState-Speicherplatz verschwendet. Um dieses Problem der Ressourcenverschwendung zu lösen, sollten Werte, die nach der deklarativen Definition nicht geändert wurden, nicht mit ViewState beibehalten werden. Die detaillierte Implementierung ist der oben erwähnte TrackViewState-Mechanismus.
Apropos Control.ViewState wurde erklärt. Wenn Sie ein Steuerelementdesigner sind, können Sie Steuerelementeigenschaften auf folgende Weise sicher in ViewState speichern:
öffentlicher String-Text
{
get {return this.ViewState["Text"] as string;}
set {this.ViewState["Text"] = value;}
}
Sein interner Mechanismus kann unterscheiden, ob der von Ihnen gespeicherte Wert der deklarativ in ASPX definierte Anfangswert ist, und dann entscheiden, ob der Wert beibehalten werden soll. Wenn Sie gleichzeitig die Bestimmung, ob ein ViewState-Wert zu irgendeinem Zeitpunkt dauerhaft ist, ändern möchten, können Sie diese über ViewState.SetItemDirty (key, dirty) ändern, was grundsätzlich den Anforderungen aller Steuerelemententwickler entspricht.
http://www.cnblogs.com/cathsfz/archive/2006/10/29/543695.html