ViewState(状態管理)

概念

Httpでは状態という概念がありません。ViewStaeはサーバーコントロールの状態を維持するための機構です。

PostbackはAsp.netの特徴な機能の一つです。ViewStateはこの機能を簡単に動作するために、提供している状態維持する手段です。簡単にいうとViewStateはページフレームワークに管理されているHidden Field(__VIEWSTATE)の文字列です。

ViewState はコントロールの情報を保存するではなく、Form 内対応するコントロールの値を保存します。特にFormと一緒にPostされていないコントロールの値、ページ生成に利用する状態値をHidden Fieldに格納しています。

ページはサーバーへPostBackされたとき、サーバーはViewStateのデータを解析、検証、使用して、ページ内のコントロール状態を復元します。ViewState 利用するデメリットは、サーバーへのリクエストとリスポンスの時間が長くなって、毎回のPostBackにデータのシリアライズとデシリアライズ処理が行っていますので、処理に時間がかかります。

内部動作の流れ
  1. Asp.netはページを実行する時、ページのSaveViewStateメソッドは該当ページのViewStateとすべてのコントロールが検出し、Base64でエンコードでオブジェクトにシリアライズして、FormのHidden Field(__VIEWSTATE)に値を渡します。
  2. 表示するページのHTMLコードをクライアントへ送信します。
  3. FormのHidden Fieldはクライアントへ送信するページの一部であるため、クライアントのブラウザに一時保存されます。
  4. クライアントはPostbackする際に、ViewStateの値もサーバーへ送信します。
  5. 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レベルで無効にしても、コントロールの状態データへの影響しません。