先週、「コントロールの ViewState プロパティの値はどこに保存されるの?」という記事を書きましたが、Control.ViewState には最終的に Control.SaveViewState と Control.LoadViewState の 2 つのメソッドを通じてアクセスされると説明しました。この記事には、あなたを混乱させる可能性のある文があります。「OnInit の後に this.ViewState[key] を使用して読み書きすると、このプロパティは true になります。」ここで、「このプロパティ」とは StateItem.IsDirty を指します。 OnInit の後、IsDirty プロパティが常に true になるのはなぜですか? ViewState を本当に理解するを参照して、それが必ずしも正しいとは限らないことをようやく理解しました。詳細な理由を説明するのを聞いてください。
最初に確認する必要があるのは、StateBag.TrackViewState メソッドです。このメソッドは、コントロール OnInit のときに呼び出され、StateBag が StateItem の変更の追跡を開始することによって、StateItem の IsDirty プロパティが true になります。 。つまり、OnInit の前では、IsDirty プロパティは false であり、Value プロパティの値をどのように設定しても、IsDirty プロパティは変更されません。 OnInit の後、Value プロパティの値を初めて変更するまで、IsDirty プロパティも false のままになります (this.ViewState[key] メソッドによる変更を指します)。 SaveViewState ステージでは、IsDirty 属性が true である StateItem のみが保存されます。
なぜこのように設計されているのでしょうか?たとえば、宣言的に定義されたラベルの Text プロパティには ASPX で初期値が割り当てられ、その初期値は ViewState["Text"] を通じて自然に保持されます。次のページ ライフ サイクルでは、最初にこの Label の Text プロパティが OnInit 中に ASPX で宣言的に定義された初期値を読み込み、次に LoadViewState 中に ViewState から読み取られた ViewState["Text"] でそれを上書きします。ただし、前のページのライフサイクルで Text プロパティをプログラムで変更しない限り、ViewState["Text"] は依然として初期値であるため、ViewState["Text"] を使用して初期値を保存し、宣言的に定義された初期値を上書きします。この方法で同じ値を上書きすることはまったく無意味であり、ViewState スペースも無駄にします。このリソースの無駄の問題を解決するには、宣言的な定義後に変更されていない値を ViewState を使用して永続化すべきではなく、詳細な実装は前述の TrackViewState メカニズムです。
そういえば、Control.ViewState については説明しましたが、コントロールの設計者であれば、次の方法でコントロールのプロパティを ViewState に安全に保存できます。
パブリック文字列 テキスト
{
get {return this.ViewState["Text"] を文字列として返します;}
set {this.ViewState["Text"] = 値;}
}
その内部メカニズムは、保存した値が ASPX で宣言的に定義された初期値であるかどうかを識別し、その値を保持するかどうかを決定します。同時に、任意の段階で ViewState 値が永続的であるかどうかの決定を変更したい場合は、ViewState.SetItemDirty(key, Dirty) を通じて変更できます。これは基本的にすべてのコントロール開発者のニーズを満たします。
http://www.cnblogs.com/cathsfz/archive/2006/10/29/543695.html