asp.net:ControlStateメカニズムの使用

このメモは、ControlStateの概要と使用方法を知らない人を対象としています。 ページの状態を維持するこの手法に精通している場合は、このトピックを安全にスキップできます。



すべてのasp.netプログラマーは、Webページおよびコントロールの状態を保持するデフォルトの方法を提供するViewStateテクノロジーを認識しています。 ここでの長所と短所については説明しませんが、これがないと、ViewStateが片側に便利で、反対側に大量の生成されたページを備えた両刃の剣であることがわかります(たとえば、ViewViewでViewStateを有効にした場合) 。 asp.netの主要なメカニズムの1つが、パフォーマンスのために開発中にオフになることがよくありました。



通常、ViewStateは単に指定するだけでページ全体で無効になります

<%Page EnableViewState = "false"%>

この場合の利点は非常に大きく、ページにはマークアップ(asp.netバインディングも含む)のみが含まれ、さらに、ViewStateデータの生成を制御することはできません。

1つありますが、ViewStateをオフにすると、完全にオフになります。たとえば、ViewStateで動作し、 habrahabr.ru / blog / net / 41790.htmlスニペットについてこの記事で説明する次のコードは、 正常に動作しません。

public int MyProperty

{

得る

{

オブジェクト o = ViewState [ "MyProperty" ];

return (o!= null )? int )o:0;

}

セット

{

ViewState [ "MyProperty" ] = value ;

}

} *このソースコードは、 ソースコードハイライターで強調表示されています。




一方、EnableViewState = "false"であってもViewStateを使用する方法があります。 この手法はControlStateと呼ばれます。 ViewStateをオフにできる場合、ControlStateはできません。 例を考えてみましょう:

[ シリアライズ可能 ]

struct PageStateStruc

{

public FormState CurrentState;

パブリック int CurrentResume

public int CurrentSection;

}

PageStateStruc PageState;



保護された オーバーライド void OnInit( EventArgs e)

{

ページ .RegisterRequiresControlState( this );

base .OnInit(e);

}



保護された オーバーライド オブジェクト SaveControlState()

{

Return PageState;

}



保護 オーバーライド void LoadControlState( オブジェクト savedState)

{

PageState =(PageStateStruc)savedState;

} *このソースコードは、 ソースコードハイライターで強調表示されています。




これにより、特定のPageStateStrucデータ構造が定義され、そのインスタンスが保持されます。 使用される構造に必要なSerializable属性に注意してください。 PageState構造のインスタンスがすぐに定義されます。



次に、OnInitハンドラーでRegisterRequiresControlStateメソッドが呼び出され、現在のページがControlStateを保存するコントロールとして登録されます。 これの代わりに、任意のユーザーコントロールを指定できます。 OnInitでRegisterRequiresControlStateを呼び出すことをお勧めします。



SaveControlStateとLoadControlStateの2つのオーバーロードメソッドが全体像を完成させます。これは、ご覧のとおり、必要なデータを単にロードおよびアンロードするだけです。 asp.netはこれらのメソッドを呼び出します。

以上です! ページリクエスト間のPageStateデータは自動的に保存されます。 実際、ページ呼び出し間でデータを保存するには、データのタイプを判別し、このデータを保存/ロードする方法を記述するだけです。 残りはasp.netによって行われます。



あとがき



ViewStateをページ全体で無効にすることをお勧めします。 データを保存する必要がある場合は、ControlStateを使用します。 ただし、このデータが単一の変数またはプロパティの値である場合、HiddenFieldコントロールを使用するのが賢明です。 いくつかの実験により、1つのフィールドに対してHiddenFieldによって生成されたマークアップは、同じフィールドに対してControlStateメカニズムが生成するViewState行よりも少ないスペースを占めることが示されています。



All Articles