概念
Httpでは状態という概念がありません。ViewStaeはサーバーコントロールの状態を維持するための機構です。
PostbackはAsp.netの特徴な機能の一つです。ViewStateはこの機能を簡単に動作するために、提供している状態維持する手段です。簡単にいうとViewStateはページフレームワークに管理されているHidden Field(__VIEWSTATE)の文字列です。
ViewState はコントロールの情報を保存するではなく、Form 内対応するコントロールの値を保存します。特にFormと一緒にPostされていないコントロールの値、ページ生成に利用する状態値をHidden Fieldに格納しています。
ページはサーバーへPostBackされたとき、サーバーはViewStateのデータを解析、検証、使用して、ページ内のコントロール状態を復元します。ViewState 利用するデメリットは、サーバーへのリクエストとリスポンスの時間が長くなって、毎回のPostBackにデータのシリアライズとデシリアライズ処理が行っていますので、処理に時間がかかります。
内部動作の流れ
- Asp.netはページを実行する時、ページのSaveViewStateメソッドは該当ページのViewStateとすべてのコントロールが検出し、Base64でエンコードでオブジェクトにシリアライズして、FormのHidden Field(__VIEWSTATE)に値を渡します。
- 表示するページのHTMLコードをクライアントへ送信します。
- FormのHidden Fieldはクライアントへ送信するページの一部であるため、クライアントのブラウザに一時保存されます。
- クライアントはPostbackする際に、ViewStateの値もサーバーへ送信します。
- Asp.netはPostbackしたViewStateの文字列を解析して、LoadViewStateメソッドでViewStateの値で該当ページと各コントロールの状態を復元します。
まとめると、サーバーはページ内のオブジェクトの状態をシリアライズして、クライアントへ送信します。
Postback時クライアントから送信したViewStateをデシリアライズして、前の状態を取得します。
使用例
基本的に、ASP.NET Web サーバー コントロールは、プロパティ値をインスタンスフィールドとしては保持しません。
Stringをキー、Objectを値とするディクショナリであるViewStateに、プロパティごとに異なる文字列をキーとして保存します。
ソースコード例:
String s = ViewState["Text"] as String; return (s == null) ? String.Empty : s;
留意点
- ViewStateは必ず<form runat=server>とマークされているブロック内で使用します。
- Postback時、データとViewStateの値を正しいコントロールへ渡すため、ページ自身では、20バイトくらいの情報をViewStateに保存していますので、ViewStateを禁止にしても、ViewStateのHidden Fieldに少量な文字列が入っています。
- 大量のデータをViewStateに保存する場合、帯域が狭い環境だと、ページのダウンロードとアップロードスピードが遅くなる可能性があります。
この問題を回避するため、ViewStateの値をサーバーで管理する方法(データベース、ファイル、Sessionなど)がありますが、ケースによって、採用するかどうか判断してください。 - ViewStateの利用はサーバーのメモリを消費しています。
- ViewStateのデータが大きすぎると、タイムアウトが発生します。デフォルトは20分。
- ViewStateはすべての.NETのタイプをサポートするわけではありません。string、int、bool、array、arraylist、hashtableと自定義の typeconverter
- デフォルトでは、ViewStateは暗号化されていません。
- ViewStat状態管理の範囲はポストバックの単位になります。一度値を渡して、別ページへ遷移し、戻ったら、値はリセットされます。
- Aspxページの先頭の設定に「EnableViewState=”false”」と設定すると、ViewStateが無効になります。
- ページ遷移に値の取り渡しに利用できません。
- ViewStateがPageレベルで無効にしても、コントロールの状態データへの影響しません。