動的な Web サーバー コントロールとビューステート
更新 : 2007 年 11 月
Web サーバー コントロールを実行時に動的に作成した場合、コントロールに関する一部の情報が、ページと共にレンダリングされるビューステートに格納されます。ただし、ページがサーバーにポスト バックされるときは、ページ上で定義されたスタティック コントロールがページの Init イベントでインスタンス化され、ビューステートの情報はダイナミック コントロールが再作成される前に (通常は Page_Load ハンドラで) 読み込まれます。実際、ダイナミック コントロールが再作成される前のビューステートでは、ページ内のコントロールとの同期が一時的に失われます。Page_Load イベントが発生した後、コントロールのイベント処理メソッドが呼び出される前に、ビューステートに関する残りの情報が、動的に作成されたコントロールに読み込まれます。
大半のシナリオでは、ビューステートの処理モデルは適切に機能します。通常、ダイナミック コントロールは、コンテナのコントロール コレクションの最後に追加してください。ダイナミック コントロールについて格納されたビューステートの情報は、適切なコンテナに対して、ビューステート構造体の最後に付加される補足情報です。ページは、コントロールが作成されるまでその情報を無視できます。
ただし、動的に作成されるコントロールについてのビューステート情報は、次の 2 つの状況において問題となる可能性があります。
既存のコントロールの間にダイナミック コントロールを挿入する場合。
コントロールを動的に挿入し、その後、ラウンド トリップ中に、同じコントロールに異なる値を指定して再度挿入する場合。
ダイナミック コントロールを既存のコントロールの間に挿入する場合、ダイナミック コントロールのビューステート情報は、ビューステート構造体の対応する場所に挿入されます。ページがポストされビューステート情報が読み込まれる段階では、ダイナミック コントロールはまだ存在しません。このため、ビューステートの補足情報は、正しいコントロールに対応しません。その結果、無効なキャストを示すエラーが発生します。
ラウンド トリップごとにコントロールを再挿入する場合は、動的に作成されるコントロールが生成されるたびに、先行するコントロールのビューステートからプロパティ値が取得されます。多くの場合、コンテナ コントロールの EnableViewState プロパティを false に設定することにより、この問題を回避できます。この場合、ダイナミック コントロールに関する情報は保存されないため、逐次作成されるコントロール間で競合は発生しません。
ビューステートの詳細については、次のリンクを参照してください。
ASP.NET の状態管理の概要、および ViewState