- PR -

ReadOnly項目への書き込みについて

投稿者投稿内容
Java人
ベテラン
会議室デビュー日: 2005/06/24
投稿数: 94
投稿日時: 2006-09-08 19:31
>私もどっとねっとふぁんさんと同様に、仕様的には納得できますね。
>ReadOnly の項目と言うことは、基本的に(今回のように JavaScript などを
>使わない限り)内容が変更されることはないはずなので、変更されていないもの
>をわざわざ ViewState でサーバーに送る必要はないと考えられているのだと
>思います。
>というわけで、納得と言うか「おまえあったまいーな!」的な部分もあったり。

[EnableViewState=false][ReadOnly=True]の項目に対して
JavaScriptで変更してsumitしたらなぜサーバーサイドで変更した内容を参照できるのでしょうか?



直接クライアントのテキストをサーバーサイドが参照しているのでしょうか?
もしそうなれば、EnableViewStateプロパティの意味がよくわかりません・・・
(毎回クライアントのテキストを見ればいいのではと思いました)
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-09-08 19:46
私の思っていたスレッドはここでしたがこちらのほうが今回の話に近いですね。

引用:
直接クライアントのテキストをサーバーサイドが参照しているのでしょうか?
もしそうなれば、EnableViewStateプロパティの意味がよくわかりません・・・
(毎回クライアントのテキストを見ればいいのではと思いました)

直接という意味がちょっと理解できないですが(POSTパラメータとかのことですかね?)、
ViewStateには、本来POSTパラメータでは送信されないコントロールのプロパティの値も含まれます。

MSDNには
「…(略)…読み取り専用テキスト ボックスはサーバーで処理されません。これにより、悪意のあるユーザーが読み取り専用の Text 値を変更できなくなります。…(略)…」とあります。
セキュリティ考慮が主な目的でしょうかね。

[追記]
ん。。深く読んでいませんでした。。

まず、上記はASP.NET2.0で加わった動きのようですね。EnableViewStateの仕様というよりは
コントロール状態の復元の仕様のような気もしますが。

引用:
ReadOnly の項目と言うことは、基本的に(今回のように JavaScript などを
使わない限り)内容が変更されることはないはずなので、変更されていないもの
をわざわざ ViewState でサーバーに送る必要はないと考えられているのだと
思います。

これは、渡されているんだと思いますよ。

引用:
[EnableViewState=false][ReadOnly=True]の項目に対して
JavaScriptで変更してsumitしたらなぜサーバーサイドで変更した内容を参照できるのでしょうか?

EnableViewStateが何であろうが、ReadOnlyが何であろうがPOSTパラメータ自体は
渡されます。ViewStateというのはコントロール状態の保存の方法の一つにすぎないのです。

引用:
項目のプロパティで
 EnableViewState=False
 ReadOnly=True
にすると、サーバーサイドに値が渡されてきました。

TextBox1.Textのように取得できたってことですか?
私のところではjavascriptで変更した値は取得できませんでした。。(ASP.NET2.0)

[ メッセージ編集済み 編集者: べる 編集日時 2006-09-08 20:13 ]
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-09-08 20:18
引用:

ぽぴ王子さんの書き込み (2006-09-08 19:09) より:
ReadOnly の項目と言うことは、基本的に(今回のように JavaScript などを
使わない限り)内容が変更されることはないはずなので、変更されていないもの
をわざわざ ViewState でサーバーに送る必要はないと考えられているのだと
思います。
というわけで、納得と言うか「おまえあったまいーな!」的な部分もあったり。


ちょっと違うと思いますよ。
ViewStateが有効になっている場合、ReadOnlyなテキストボックスの値等も
ViewStateに保存されます。
サーバ側では、ReadOnlyなのでクライアント側で変更されることは無いと判断し、
ViewStateの値を復元します(POSTされたTextBoxの値自体は無視)。
これにより、ReadOnlyのテキストボックスがユーザにより改竄される心配はない
という前提でサーバ処理を記述できます(これがセキュリティ云々の話)。

ViewStateが無効になっている場合、TextBoxの状態(値)はViewStateに記録されて
いませんので、初期化するかPOSTされた値を使うかどちらかしか出来ません。
少なくとも、ViewStateから値を復元することは出来ません(情報がない)ので、
クライアントに送信前のサーバ側での値が、強制的に復元されることもありません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-09-08 22:27
なんか、言い尽くされているような気がするけど、せっかく書いたので上げさせてくれ。


 イベントは、状態が変化するから発生します。
しかし、サーバとクライアントが完全に分離している Web アプリケーションでは、状態が変化したときにイベントが発生するべきところが、状態が変化したことを知ることができません。
そこで、イベントを発生させるかどうかを判断するために、「今の状態」を憶えておかなければなりません。
ASP.NET では、ViewState に「今の状態」を保存することで、これを可能にしました。

 ところが、ViewState には、デフォルトではないプロパティなどの値がすべて格納されます。このため、サーバ/クライアント間のトラフィックが増大します。
そこで、開発者が、「今の状態」を憶えておく必要がないコントロールについて、「今の状態」を保存するかどうかを設定できるように、EnableViewState プロパティが用意されました。

 このプロパティが True だと、サーバ側で HTML にレンダリングされた後、コントロールの内容が ViewState に格納されます。
ポストバックされると、まず、ViewState から、以前の状態が復元されます。
この後、ポストされた内容が反映され、これによって Changed 系のイベントが駆動する準備が整います。
ReadOnly プロパティが True であれば、ポストされる内容は ViewState と同じはずですから、またセキュリティ上の見地からも、ポスト内容が反映されるのはおかしいでしょう。

 しかし、EnableViewState が False だと、コントロールの内容は ViewState に書き出されません。
ポストバックは、基本的にポストされたときと同じ内容を表示しますから、変更されていないはずのポスト内容を取り込まなければなりません。
取り込まないのなら、プログラム中で内容を設定してやらなければなりません。
しかし、ポスト情報を取り込むところで取り込んでくれたなら、もしかするとコストが高いかもしれない「データを復元する処理」をする必要がなくなります。


 こんな感じで理解できますか。

# ってか、ReadOnly なコントロールにスクリプトから値を設定できたっけ?
# いったん書き込み可にして、書き込んだ後にまた書き込み不可にしたような?
# ブラウザ依存な気がするなぁ?
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-09-09 00:10
引用:
# ってか、ReadOnly なコントロールにスクリプトから値を設定できたっけ?
# いったん書き込み可にして、書き込んだ後にまた書き込み不可にしたような?
# ブラウザ依存な気がするなぁ?

ReadOnly="ReadOnly"ならIE6とFireFox1.5.0.6では設定、送信ともにできるようです。
disabled="disabled"だと設定はできるけど送信はされないですね。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-09-11 11:06
こんにちは。

引用:

べるさんの書き込み (2006-09-08 19:46) より:

これは、渡されているんだと思いますよ。


引用:

なちゃさんの書き込み (2006-09-08 20:18) より:

ちょっと違うと思いますよ。



方々から鋭いツッコミを受けていますが私の投稿はまったくの想像(と勘違い)
でしかなかったようです。Java人さんおよび読んでいらっしゃる方々を混乱させ
てしまったかもしれません。どうも申し訳ないです。
手元に ASP.NET の環境がないのに、昔の曖昧な記憶だけで書いてしまったの
がマズかったです。キチンと裏づけを取ってから回答するようにします。
# あまりのアホさ加減(自分ね)にちょっと落ち込んだのは内緒
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
Java人
ベテラン
会議室デビュー日: 2005/06/24
投稿数: 94
投稿日時: 2006-09-11 13:16
>書き込みを頂きました皆様
いろいろとありがとうございます。

様々な検証を行った結果、Changeイベントを使用していないので
現時点では、[EnableViewState=false][ReadOnly=true]で
実装しようと思います。

実装・検証の仮定で新たな弊害が発見された場合は、
「隠し項目を介して内容をサーバーサイドへ渡す」などの
方法を検討したいと思います。

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