動的な Web サーバー コントロールとビューステート

更新 : 2007 年 11 月

Web サーバー コントロールを実行時に動的に作成した場合、コントロールに関する一部の情報が、ページと共にレンダリングされるビューステートに格納されます。ただし、ページがサーバーにポスト バックされるときは、ページ上で定義されたスタティック コントロールがページの Init イベントでインスタンス化され、ビューステートの情報はダイナミック コントロールが再作成される前に (通常は Page_Load ハンドラで) 読み込まれます。実際、ダイナミック コントロールが再作成される前のビューステートでは、ページ内のコントロールとの同期が一時的に失われます。Page_Load イベントが発生した後、コントロールのイベント処理メソッドが呼び出される前に、ビューステートに関する残りの情報が、動的に作成されたコントロールに読み込まれます。

大半のシナリオでは、ビューステートの処理モデルは適切に機能します。通常、ダイナミック コントロールは、コンテナのコントロール コレクションの最後に追加してください。ダイナミック コントロールについて格納されたビューステートの情報は、適切なコンテナに対して、ビューステート構造体の最後に付加される補足情報です。ページは、コントロールが作成されるまでその情報を無視できます。

ただし、動的に作成されるコントロールについてのビューステート情報は、次の 2 つの状況において問題となる可能性があります。

  • 既存のコントロールの間にダイナミック コントロールを挿入する場合。

  • コントロールを動的に挿入し、その後、ラウンド トリップ中に、同じコントロールに異なる値を指定して再度挿入する場合。

ダイナミック コントロールを既存のコントロールの間に挿入する場合、ダイナミック コントロールのビューステート情報は、ビューステート構造体の対応する場所に挿入されます。ページがポストされビューステート情報が読み込まれる段階では、ダイナミック コントロールはまだ存在しません。このため、ビューステートの補足情報は、正しいコントロールに対応しません。その結果、無効なキャストを示すエラーが発生します。

ラウンド トリップごとにコントロールを再挿入する場合は、動的に作成されるコントロールが生成されるたびに、先行するコントロールのビューステートからプロパティ値が取得されます。多くの場合、コンテナ コントロールの EnableViewState プロパティを false に設定することにより、この問題を回避できます。この場合、ダイナミック コントロールに関する情報は保存されないため、逐次作成されるコントロール間で競合は発生しません。

ビューステートの詳細については、次のリンクを参照してください。

ASP.NET ページのライフ サイクルの概要

ASP.NET の状態管理の概要、および ViewState

参照

その他の技術情報

プログラムによる ASP.NET コントロールの追加

プログラムによる ASP.NET サーバー コントロール プロパティの設定