- PR -

ASP.NETのviewstateについて

1
投稿者投稿内容
オレンジ
会議室デビュー日: 2006/04/10
投稿数: 8
投稿日時: 2008-03-24 11:23
現在ASP.NET(VB)の勉強中でして、Form認証のページを作っています。
ポストバックしたときにviewstateを元に処理を行っていることはなんとなくわかったのですが、viewstateが具体的にどのような値を持っているのかがよくわかりません。
ViewStateDecoderをダウンロードして中身を見ているのですが、ポストバック時に呼ばれるメソッドの情報やサーバの情報を持っているのかと思いきや、そういった情報がなかなか見当たりません。
ViewStateDecoderの見方が誤っているのかもしれませんが。。

また、他のスレッドで「EnableViewState、EnableViewStateMacをfalseにしたら動きました」という書き込みを見かけたのですが、どうしてfalseにすることで動くのか、その理由がよくわかりません。


上記より、知りたいのは以下の2点です。
(1)ViewStateDecoderを用いて参照したviewstate値の読み方(ViewStateがどのような値を持っているのか)
(2)認証ページでEnableViewState、EnableViewStateMacをfalseにする意味



どうぞよろしくお願いします。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2008-03-24 20:19
認証と ViewState がどう関連すると言っているのかよく分からないんですが、ViewState は基本的に「その時に表示している画面の情報」と考えて良いです。もちろん独自の情報を設定することも可能です。
各コントロールが「次回の POST でも覚えておきたい情報」を各コントロールの責任で保存しているものです。
で、ViewState と POST の値で差分があれば、イベントを発生させたりします。
たとえば、TextBox に "aiueo" と表示した状態で画面を表示すると、ViewState には TextBox.Text が "aiueo" となっていると設定されています。ブラウザで、"kakikukeko"と書き変えて POST すれば、ViewState は "aiueo"、POST 値 は "kakukukeko" となっているので、TextBox.TextChanged イベントが発生する、とう具合です。

引用:

また、他のスレッドで「EnableViewState、EnableViewStateMacをfalseにしたら動きました」という書き込みを見かけたのですが、どうしてfalseにすることで動くのか、その理由がよくわかりません。


何が動かなくて、何が動いたのか分からないので何とも言えません。
_________________
囚人のジレンマな日々
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-03-25 10:41
Form認証はクッキーによる認証チケットの保持によるものなので、ViewStateとはあまり関係ないかな。
ViewStateの中身については囚人さんが書いているとおりですね。

EnableViewStateをfalseにする場合、というのはたとえばSqlDataSourceを使ってGridViewを表示しているようなとき、たとえページングを利用して表示しているデータを制限しているとしてもViewStateには抽出してきたすべてのデータが入ることになります。
このときあまりにデータ数が大きく、ViewStateが膨大になったりすると、PostBack時に動きがおかしくなることがあり、そういった場合にEnableViewStateをfalseにするととりあえず動いたりしますね。
GridViewのページングとかの対応は別に必要になりますが。

あと、EnableViewStateMacをfalseに、というのはTransferメソッドを利用してページ遷移を起こすような場合に、状況によっては必要になる話だと思います。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfSystemWebHttpServerUtilityClassTransferTopic2.asp
このあたりにある程度の説明がありますね。

認証に関してEnableViewStateやEnableViewStateMacをfalseにする、という話はあったかなぁ?
どのスレッド、と具体的に提示されればなぜその設定が必要なのか考えてみることはできるかもしれませんが。。。

何を気にしているのかわかりませんが、認証について調べているのであれば、ちょっと横道にそれているような気もします。
何か認証について疑問があるんであれば、その疑問を直接聞いたほうがよいかも。
オレンジ
会議室デビュー日: 2006/04/10
投稿数: 8
投稿日時: 2008-03-25 13:48
コメントありがとうございます。
自分の文書表現力の低さを猛省しています。

Form認証サイトについては置いておいて、まず知りたいのはviewstateがページの情報をどのように保持しているのか。です。

囚人さまのコメントに
引用:

ViewState は基本的に「その時に表示している画面の情報」と考えて良いです。もちろん独自の情報を設定することも可能です。


とありますが、その情報を具体的にどのように持っているのかを知りたいです。

以下のソースで簡単に試してみました。
***************************
<%@ Page Language="VB" EnableViewState="false" EnableViewStateMac="false"%>
<script runat="server">
Protected Sub Page_Load(ByVal source As Object, ByVal e As EventArgs)
IdLabel.Text = "USER-ID : "
PwLabel.Text = "PW : "
End Sub

Protected Sub LoginButton_OnClick(ByVal source As object, ByVal e As EventArgs)
MyLabel.Text = "UserID[" + UserId.Text + "] PW[" + PW.Text + "]"
End Sub
</script>
<HTML>
<BODY>
<FORM runat="server">
<asp:Label runat="server" id="IdLabel" />
<asp:TextBox runat="server" id="UserId" />
<HR>
<asp:Label runat="server" id="PwLabel" />
<asp:TextBox runat="server" id="PW" />
<HR>
<asp:Button runat="server" id="LoginButton" text="ログイン"
onclick="LoginButton_OnClick" />
<HR>

<asp:Label runat="server" id="MyLabel" />

</FORM>
<form name="form1" method="post">
<input type="button" value="確認" onclick="javascript:confirm_onclick()">
</form>
</BODY></HTML>

***************************


ブラウザで表示させた際のViewState値は「/wEPDwUJNTA0NDM5OTIwZGQ=」で、この値をViewState Decoderでデコードさせると以下になりました。

***************************
<?xml version="1.0" encoding="utf-16"?>
<viewstate>
<Pair>
<Pair>
<String>504439920</String>
</Pair>
</Pair>
</viewstate>
***************************

この「504439920」が何らか「その時に表示している画面の情報」を持っていると思うのですが、調べるのに息詰まってしまいました。このデコードした情報の見方をご教授いただけないでしょうか。

また、最初の質問とは異なるのですが、使用する.NETFrameworkのバージョンによって同じソースでもviewstateの値が異なります。(仮想ディレクトリを2つ作成し、片方は.NETFramework1.1、もう片方は.NETFramework2.0で同じコードを実行)viewstateの値は.NETFrameworkのバージョン情報も持ち合わせているのでしょうか。

囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2008-03-26 01:34
引用:

とありますが、その情報を具体的にどのように持っているのかを知りたいです。


コントロールの実装によるので正確に知るのは難しいと思いますよ。
例えば、Label.Text に設定した文字列をそのまま ViewState に書き出しているのか、何かエンコード処理を行って書き出しているのかは Label の実装次第です。
更に、ViewState 全体を暗号化して出力するという事もあります。

従って、
引用:

また、最初の質問とは異なるのですが、使用する.NETFrameworkのバージョンによって同じソースでもviewstateの値が異なります。(仮想ディレクトリを2つ作成し、片方は.NETFramework1.1、もう片方は.NETFramework2.0で同じコードを実行)viewstateの値は.NETFrameworkのバージョン情報も持ち合わせているのでしょうか。


バージョンが違えば、ViewState に書き出される情報が違うという事ももちろんあり得ます。バージョン情報はおそらく持っていないでしょうけど、コントロールからすれば書いたものを読めばよいだけなので。

要するに、ViewState の中身を知りたいという理由が、好奇心以外の理由なら間違っています。何か実装に依存した事をやりたいのでしょうか?
_________________
囚人のジレンマな日々
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-03-26 07:11
たいていは、デフォルトから変更したプロパティ値が入っています。


Windows アプリケーションと違い、Web アプリケーションでは、サーバーが処理をするごとにオブジェクトが作り直されます。このとき、前回に送り出した状態を復元するための情報が、ViewState、見えている状態です。前回の囚人さんのレスにあるように、サーバーでは、デザイン時の状態でオブジェクトを初期化し、ViewStateから前回表示させた状態を再現し、ポスト情報から変化を受け取ってイベントを駆動させます。ボタンクリックなど、前回からの変化で表せない情報は、ポスト情報にあります。
ViewStateとポストする情報が整理されていないように感じました。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-03-26 08:31
引用:
<%@ Page Language="VB" EnableViewState="false" EnableViewStateMac="false"%>

ご提示のソースに限って言えばEnableViewStateがfalseなので
「その時に表示している画面の情報」は保持していません。trueにして試してみてください。
1

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