- PR -

プログラミングASP.NET第2回の記事について

1
投稿者投稿内容
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2002-05-30 05:14
引用:

ところがASP.NETページでは、特別なコードを追加することなく、フォームの復元が実現されている。これはASP.NETの「自動状態管理」と呼ばれる機能によって、ポストバックされたコントロールの状態が保存され、自動的に復元されているからだ。従って、ASP.NETページではコントロールの値を明示的に復元する必要はない。

 なおASP.NETでは、ランタイム時に修正されたサーバ・コントロールのプロパティを維持するための、ビュー・ステートと呼ばれる仕組みも提供されている。ビュー・ステートに保存されたデータは、リスト3にも見られるように、次のような隠しフォーム・フィールドを使って、サーバとのラウンド・トリップを超えて受け渡しが行われる。これによって、動的に設定されたサーバ・コントロールのプロパティや、通常ならばポストバックされない、例えばサーバ・コントロールの背景色などの情報も受け継ぐことができる。




この記事で「自動状態管理」とビュー・ステートを解説していますが
自動状態管理とビュー・ステート(View State)は、別々の機能なのでしょうか。
それともView Stateの日本語訳が「自動状態管理」なのでしょうか。

Page DirectiveにEnableViewState="False"を指定しても
TextBoxコントロールなどは、PostBackされたときに入力したデータが復元されます。

また、TextBoxコントロールに直接 EnableViewState="False"を指定しても
PostBackされたときに入力したデータが復元されます。

つまり、TextBoxコントロールに入力したデータは、EnableViewStateで
False|Trueのいずれを指定してもPostBackされたときに復元されます。

ただし、ViewState("myViewState") = "Some Value"のように
ViewState()に格納した値は、EnableViewState="False"を指定すると
無効になります。

EnableViewState="False"は、どのようなときに指定すると
効果があるのでしょうか。
KSK
会議室デビュー日: 2002/04/09
投稿数: 4
投稿日時: 2002-05-31 19:32

ビューステートは、自動状態管理を実現する仕組みの一部だと考えればいいでしょう。

テキストボックスの文字列や、リストボックスの選択アイテムといった情報は、
普通にフォームからサブミットすれば、サーバに送信されますから、
ビューステートが無くても復元されます。

しかし、サーバーコントロールはそのほかにも、サイズや文字色といった
さまざまな状態を持っています。こうした状態は通常ポストバックされない
ため、復元することができません。そこで用意されたのがビューステート
です。

詳しくは次回執筆を予定しているPageディレクティブの解説をごらんください。
XmlInfoSet
会議室デビュー日: 2001/11/30
投稿数: 5
投稿日時: 2002-06-01 10:23
引用:

KSKさんの書き込み (2002-05-31 19:32) より:
しかし、サーバーコントロールはそのほかにも、サイズや文字色といった
さまざまな状態を持っています。こうした状態は通常ポストバックされない
ため、復元することができません。そこで用意されたのがビューステート
です。


でも、実験してみるとビューステートのHIDDENの中身は、サーバーコントロールのサイズや文字色を変えても変わらないし、大体これらのプロパティはaspxファイル(.csファイル)に書いてあるからポストバックしなくても復元できますよね??(その証拠にEnableViewStateプロパティをFalseにしても状態は維持できるみたいです)自分の実験結果を見ると、ビューステートのHIDDENと状態維持は関係ないような気がするんですが??
KSK
会議室デビュー日: 2002/04/09
投稿数: 4
投稿日時: 2002-06-01 14:57

田口です。

本文にもあるとおり、ビューステートは「ランタイム時」に変更されたプロパティ値
を維持するための機構です。イベントハンドラでプロパティ値を変更するコードを
書いて実験してみてください。EnableViewStateの値によって、__VIEWSTATEの
値が変化する様子が確認できると思います。

詳しくは次回サンプルを交えて解説します。

Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2002-06-03 09:51
引用:

テキストボックスの文字列や、リストボックスの選択アイテムといった情報は、
普通にフォームからサブミットすれば、サーバに送信されますから、
ビューステートが無くても復元されます。




Q316813 にも記述されていました。

ありがとうございます。

私なりにまとめると:

TextBox, CheckBox, RadioButtonなどのように form-get, form-postで
サーバにポストされるデータは、IPostBackDataHandlerにて復元される。
(サーバにポストされますから、わざわざView State に保存する必要ありませんよね)

サーバにポストされないデータは、View State にて復元される。

「自動状態管理」機能は、IPostBackDataHandlerとView Stateで実現していることになります。

EnableViewStateは、View Stateに格納されているデータのみ適用されることになります。

ところで、EnableViewState="False"は、どのようなときに指定すると効果があるのでしょうか。ご存知の方お教えてください。

[ メッセージ編集済み 編集者: Dr ADO.NET 編集日時 2002-06-03 09:56 ]
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2002-06-04 05:06
いろいろ調べてみたのですが
EnableViewState="False"は、Repeater, DataList, DataGridなどDataコントロール系の
Web コントロールを使用するときに指定すると効果があるようです。

たとえば、 Repeaterコントロールを使用するとき EnableViewState="False"を指定
しないと、データベースの内容が View State にも保存されてページをロードする
ときに余分なオーバーヘッドになります。

<form runat="server">タグを使用しないとき(PostBack不要)は、View Stateは生成
されませんので、EnabelViewState プロパティは無効です。

Tip:
参照系のDataList, DataGridコントロールを使用するときは、
EnableViewState="False"を指定してページロード時の負荷を軽減
してください。

RadioButtonList, CheckButtonList, DropDownList, ListBoxなども
同様の理由で EnableViewState="False"を指定してください。


コード:
<form runat="server">
<asp:Repeater id="rptCustomers" runat="server" 
  EnableViewState="False">  
 ・・・
</asp:Repeater>



Note:
DataList, DataGridにレコードの編集機能を付加するときは、EnabelViewState="True"を
指定してください。

ページロード時のオーバーヘッドを軽減するには、DataGridのPageSize=を指定して
ページに表示されるレコード数を制約します。

DataListには、PageSize=のプロパティがないので編集機能を付加するときは
お勧めできません。

それから、DataGridにAllowPaging="True", AllowSorting="True"を指定
するときは、EnableViewStateプロパティを"True"に設定してください。
1

スキルアップ/キャリアアップ(JOB@IT)