コントロールの状態の維持
ASP.NET サーバー コントロールは、Control から ViewState というプロパティを継承します。このプロパティによって、コントロールの状態管理が簡単になります。ViewState の型は、名前と値のペアが格納されるディクショナリである System.Web.UI.StateBag です。ViewState は、ASP.NET ページ フレームワークによって文字列変数に永続化され、クライアントに送信され、非表示変数として返されます。ポストバックされた時点で、ページ フレームワークは非表示変数の入力文字列を解析し、各コントロールの ViewState プロパティに値を代入します。プライベート フィールドの代わりにプロパティ データの ViewState を使用するコントロールでは、このプロパティがクライアントとのやりとりの中で自動的に永続化されます (プロパティが ViewState に永続化されない場合は、ポストバックで既定値を返すと便利です)。
プロパティを ViewState に保存するコードを次に示します。
public String Text {
get {
return (String) ViewState["Text"];
}
set {
ViewState["Text"] = value;
}
}
[Visual Basic]
Public Property Text() As String
Get
Return CType(ViewState("Text"), String)
End Get
Set
ViewState("Text") = value
End Set
End Property
ViewState を使用してプロパティを格納する例については、「ASP.NET クイック スタート」の「NET サンプル - ASP.NET Web フォームのユーザー コントロール」で「Pagelet1 サンプル」を参照してください。
メモ ViewState は一般に、ラウンド トリップ間でページのフォーム データを永続化するために使用されます。ViewState には、パスワード、接続文字列、ファイル パスなどの情報を格納しないでください。ページまたはその他の永続ストレージでデータを共有する方法については、「ASP.NET の状態管理」を参照してください。
ViewState に永続化できる型
ViewState には、シリアル化可能な型、または TypeConverter が定義されている型のいずれかを永続化できます。ただし、シリアル化可能な型を使用すると、TypeConverter が定義されている型に比べて処理速度が低下し、生成される ViewState がかなり大きくなります。ViewState のシリアル化には、プリミティブ型、String 型、ArrayList 型、および HashTable 型のために最適化された、限定されたオブジェクトのシリアル化フォーマットを使用します。
ViewState とパフォーマンス
コントロールの開発者は、ViewState にデータを格納すると、自動的にクライアントとのデータのやりとりが発生することを理解しておく必要があります。データのやりとりはパフォーマンスのオーバーヘッドを発生させるため、ViewState を適切に使用することが重要です。共通データに依存するプロパティがある場合は、キー要素だけを ViewState に永続化することでパフォーマンスを最適化できます。コントロールには、Control から EnableViewState というプロパティが継承されます。コントロールのコンシューマでは、EnableViewState を使用して ViewState への永続化を有効または無効にできます。
ViewState を使用した状態復元のカスタマイズ
効率を上げるため、または既定で ViewState に格納できないカスタム タイプを保存したりするために、コントロールでは ViewState へのプロパティ データの格納方法をカスタマイズできます。コントロールでプロパティ データのストレージをカスタマイズした場合は、ViewState に格納されたデータからプロパティ値を復元するためのカスタム実装も提供する必要があります。Control 基本クラスには、プロパティ値を復元するための SaveViewState メソッドと LoadViewState メソッドが用意されています。これら 2 つのメソッドのシグネチャは次のとおりです。
protected virtual object SaveViewState();
protected virtual void LoadViewState(object savedState);
[Visual Basic]
Overridable Protected Function SaveViewState() As Object
Overridable Protected Sub LoadViewState(ByVal savedState As Object)
SaveViewState メソッドと LoadViewState メソッドの例については、「template 宣言のあるデータ連結コントロールのサンプル」を参照してください。