ViewStateを使ったデータの保存

 WebサーバーとWebクライアントはリクエストとレスポンスをやり取りして処理を進めていきます。これらはいつもつながっているわけではないので、リクエストがあったらサーバーは処理をする準備をして処理をし、結果を返したら後片付けをします。またリクエストがあったら準備をして…を繰り返していきます。

 Webアプリケーションでは、データを複数のやり取りで利用したい場合があります。上のような仕組みでは、毎回毎回データを用意しなくてはなりません。一度使ったデータはレスポンスがされたら消えてしまいます。

データが消えてしまう
データが消えてしまう

 何度かのやり取りでデータを扱いたい場合は、データを保存させなければなりません。その方法にはいくつかあります。この節ではそのうちの一つであるビューステートを使った方法を見てみましょう。ビューステートはWebブラウザーにデータを保存させます。Htmlの隠し要素としてデータを保持させ、画面上にはデータを表示しません。

データをWebクライアント側に保存
データをWebクライアント側に保存

 Webサーバーは保存したいデータをレスポンスに載せてWebブラウザーに送り、保存させます。Webブラウザーからリクエストがあった時に一緒に保存させておいたデータを送ってもらいます。

 ビューステートはStateBagオブジェクトを使って扱います。PageオブジェクトのViewStateプロパティでStateBagオブジェクトを取得できます。

■ 主なプロパティ

プロパティ名 概要
Item StateBagオブジェクト内の項目の値を取得・設定する
StateBugの主なプロパティ

■ 主なメソッド

プロパティ名 概要
Add StateItemオブジェクトをStateBagオブジェクトに追加する
既に項目が存在する場合は、値を更新する
Clear StateBag内の項目をすべて削除する
Remove StateBagオブジェクトから指定したキーと値のペアを削除する
StateBugの主なメソッド
プロジェクトの種類 ASP.NET Webアプリケーション
プロジェクト名 ViewStateTest

サンプルダウンロード

○ デザイン

 Webフォームを追加して、次のようにコントロールを配置してください。

コントロールの配置例
コントロールの配置例

○ プログラム

 次のように各イベントハンドラにプログラムを記述してください。

index.aspx.cs

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3.  //エラーメッセージを初期化する
  4.  this.lblError.Text = string.Empty;
  5. }
  6. protected void btnSave_Click(object sender, EventArgs e)
  7. {
  8.  //色名をViewStateに保存する
  9.  if (this.txtColor.Text.Length == 0)
  10.  {
  11.   this.lblError.Text = "色を入力してください。";
  12.   this.txtColor.Focus();
  13.  }
  14.  else
  15.  {
  16.   this.ViewState["color"] = this.txtColor.Text;
  17.  }
  18. }
  19. protected void btnExcecute_Click(object sender, EventArgs e)
  20. {
  21.  //ビューステートが保存してあれば、その色をTextBoxコントロールに表示する
  22.  if (this.ViewState["color"] != null)
  23.  {
  24.   this.txtColor.BackColor = System.Drawing.Color.FromName(this.ViewState["color"].ToString());
  25.  }
  26.  else
  27.  {
  28.   this.lblError.Text = "色を保存してください。";
  29.  }
  30. }

○ 実行結果

 index.aspxを実行してください。

実行結果
実行結果

○ 解説

 28行目ではViewStateプロパティにキー名colorで、txtColorに入力した文字列を格納しています。これによりWebブラウザー側に入力した文字列が保存されるようになります。38行目では、ビューステートの情報を取得して、その色をtxtColorの背景色としてセットしています。System.Draw.Color構造体のFromNameメソッドは、引数に指定した色名のColorオブジェクトを生成できます。今回は結果としてtxtColorに入力した色名を背景色として表示させています。

 ビューステートは多用しすぎるとWebサーバー・Webクライアント間でのやり取りする情報が多くなり、レスポンスが遅くなる可能性があるので注意が必要です。

前へ   次へ