- - PR -
ReadOnly項目への書き込みについて
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-09-08 19:31
>私もどっとねっとふぁんさんと同様に、仕様的には納得できますね。
>ReadOnly の項目と言うことは、基本的に(今回のように JavaScript などを >使わない限り)内容が変更されることはないはずなので、変更されていないもの >をわざわざ ViewState でサーバーに送る必要はないと考えられているのだと >思います。 >というわけで、納得と言うか「おまえあったまいーな!」的な部分もあったり。 [EnableViewState=false][ReadOnly=True]の項目に対して JavaScriptで変更してsumitしたらなぜサーバーサイドで変更した内容を参照できるのでしょうか? 直接クライアントのテキストをサーバーサイドが参照しているのでしょうか? もしそうなれば、EnableViewStateプロパティの意味がよくわかりません・・・ (毎回クライアントのテキストを見ればいいのではと思いました) | ||||||||||||||||
|
投稿日時: 2006-09-08 19:46
私の思っていたスレッドはここでしたがこちらのほうが今回の話に近いですね。
ViewStateには、本来POSTパラメータでは送信されないコントロールのプロパティの値も含まれます。 MSDNには 「…(略)…読み取り専用テキスト ボックスはサーバーで処理されません。これにより、悪意のあるユーザーが読み取り専用の Text 値を変更できなくなります。…(略)…」とあります。 セキュリティ考慮が主な目的でしょうかね。 [追記] ん。。深く読んでいませんでした。。 まず、上記はASP.NET2.0で加わった動きのようですね。EnableViewStateの仕様というよりは コントロール状態の復元の仕様のような気もしますが。
渡されます。ViewStateというのはコントロール状態の保存の方法の一つにすぎないのです。
私のところではjavascriptで変更した値は取得できませんでした。。(ASP.NET2.0) [ メッセージ編集済み 編集者: べる 編集日時 2006-09-08 20:13 ] | ||||||||||||||||
|
投稿日時: 2006-09-08 20:18
ちょっと違うと思いますよ。 ViewStateが有効になっている場合、ReadOnlyなテキストボックスの値等も ViewStateに保存されます。 サーバ側では、ReadOnlyなのでクライアント側で変更されることは無いと判断し、 ViewStateの値を復元します(POSTされたTextBoxの値自体は無視)。 これにより、ReadOnlyのテキストボックスがユーザにより改竄される心配はない という前提でサーバ処理を記述できます(これがセキュリティ云々の話)。 ViewStateが無効になっている場合、TextBoxの状態(値)はViewStateに記録されて いませんので、初期化するかPOSTされた値を使うかどちらかしか出来ません。 少なくとも、ViewStateから値を復元することは出来ません(情報がない)ので、 クライアントに送信前のサーバ側での値が、強制的に復元されることもありません。 | ||||||||||||||||
|
投稿日時: 2006-09-08 22:27
なんか、言い尽くされているような気がするけど、せっかく書いたので上げさせてくれ。
イベントは、状態が変化するから発生します。 しかし、サーバとクライアントが完全に分離している Web アプリケーションでは、状態が変化したときにイベントが発生するべきところが、状態が変化したことを知ることができません。 そこで、イベントを発生させるかどうかを判断するために、「今の状態」を憶えておかなければなりません。 ASP.NET では、ViewState に「今の状態」を保存することで、これを可能にしました。 ところが、ViewState には、デフォルトではないプロパティなどの値がすべて格納されます。このため、サーバ/クライアント間のトラフィックが増大します。 そこで、開発者が、「今の状態」を憶えておく必要がないコントロールについて、「今の状態」を保存するかどうかを設定できるように、EnableViewState プロパティが用意されました。 このプロパティが True だと、サーバ側で HTML にレンダリングされた後、コントロールの内容が ViewState に格納されます。 ポストバックされると、まず、ViewState から、以前の状態が復元されます。 この後、ポストされた内容が反映され、これによって Changed 系のイベントが駆動する準備が整います。 ReadOnly プロパティが True であれば、ポストされる内容は ViewState と同じはずですから、またセキュリティ上の見地からも、ポスト内容が反映されるのはおかしいでしょう。 しかし、EnableViewState が False だと、コントロールの内容は ViewState に書き出されません。 ポストバックは、基本的にポストされたときと同じ内容を表示しますから、変更されていないはずのポスト内容を取り込まなければなりません。 取り込まないのなら、プログラム中で内容を設定してやらなければなりません。 しかし、ポスト情報を取り込むところで取り込んでくれたなら、もしかするとコストが高いかもしれない「データを復元する処理」をする必要がなくなります。 こんな感じで理解できますか。 # ってか、ReadOnly なコントロールにスクリプトから値を設定できたっけ? # いったん書き込み可にして、書き込んだ後にまた書き込み不可にしたような? # ブラウザ依存な気がするなぁ? | ||||||||||||||||
|
投稿日時: 2006-09-09 00:10
disabled="disabled"だと設定はできるけど送信はされないですね。 | ||||||||||||||||
|
投稿日時: 2006-09-11 11:06
こんにちは。
方々から鋭いツッコミを受けていますが私の投稿はまったくの想像(と勘違い) でしかなかったようです。Java人さんおよび読んでいらっしゃる方々を混乱させ てしまったかもしれません。どうも申し訳ないです。 手元に ASP.NET の環境がないのに、昔の曖昧な記憶だけで書いてしまったの がマズかったです。キチンと裏づけを取ってから回答するようにします。 # あまりのアホさ加減(自分ね)にちょっと落ち込んだのは内緒 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||||||||||
|
投稿日時: 2006-09-11 13:16
>書き込みを頂きました皆様
いろいろとありがとうございます。 様々な検証を行った結果、Changeイベントを使用していないので 現時点では、[EnableViewState=false][ReadOnly=true]で 実装しようと思います。 実装・検証の仮定で新たな弊害が発見された場合は、 「隠し項目を介して内容をサーバーサイドへ渡す」などの 方法を検討したいと思います。 |