- PR -

TextBoxのReadonlyをtrueにするとPostBackでTextBoxの値が消えてしまう

1
投稿者投稿内容
206
会議室デビュー日: 2006/04/11
投稿数: 4
投稿日時: 2006-04-11 16:07
初心者ですがよろしくお願いします。

ASP.NET2.0でWebフォームでPostBackされた時、
サーバーコントロールのTextBoxのReadOnly属性をTrueにしていると
値が消えてしまいます。

具体的には、Readonly=trueなサーバーコントロールのTextBoxに、
JavaScriptで値を変更し、PostBackすると変更した値を取得できません。

検索キーや日付など、サブウインドウで候補を表示し、
候補からユーザーに選択させ、TextBoxに値を放り込む仕組みを提供していました。
VisualStudio2003で作ったものはできていたのですが、
VisualStudio2005で同じ事をしようとすると値を取得できなくなりました。

TextBoxのReadonlyをfalseにして、AttributesでReadonlyにtrue属性を追加すれば
いちおできることは確認できたのですが、書いてて混乱してしまいそうです。

こういう仕様なのでしょうか?
なにか良い案がありましたらご教授願います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-11 17:42
引用:

206さんの書き込み (2006-04-11 16:07) より:

TextBoxのReadonlyをfalseにして、AttributesでReadonlyにtrue属性を追加すれば
いちおできることは確認できたのですが、書いてて混乱してしまいそうです。


ここまで確認したのであれば、直接聞いてみると良いです。
MSDN フォーラムでフィードバックしてみてください。
そのためには、まず検証結果をまとめる必要があります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-11 19:05
受け付けないのが、仕様みたいですね。

  TextBox.ReadOnly プロパティ

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
206
会議室デビュー日: 2006/04/11
投稿数: 4
投稿日時: 2006-04-11 19:16
アドバイスありがとうございます。
こんなことを言うと失礼に当たるかもですが、
正直、Attributesで書いた場合どうしてできるのか
わかっていないレベルのくせにこちらに質問させていただきました。
(一番活発そうだったので)

検証結果をまとめるというのは例えばどんなことをすればよいでしょうか?
最初の投稿の感じで良いのでしょうか?
よろしければアドバイスをいただけると助かります。
206
会議室デビュー日: 2006/04/11
投稿数: 4
投稿日時: 2006-04-11 19:29
返信投稿中にスレッドが進んでいて前後してすいませんでした。

調べていただいてありがとうございます。
参照先は一度見ていたのですが、読んだ感じではできないのかな
と思ってました。
しかしながら、

バージョン情報
.NET Framework
サポート対象 : 2.0、1.1、1.0

となっていたので、2003でできてたのになんで2005だとできないのだろう
と疑問に思っていました。


[ メッセージ編集済み 編集者: 206 編集日時 2006-04-11 19:31 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-04-11 22:12
 KB で読んだような気がしたので、検索してみました。KB じゃなく、リファレンスでした。
引用:

TextBox.ReadOnly プロパティ より:

ReadOnly プロパティを true に設定した TextBox コントロールの Text 値は、ポストバックの発生時にサーバーに送信されます。ただし、読み取り専用テキスト ボックスはサーバーで処理されません。これにより、悪意のあるユーザーが読み取り専用の Text 値を変更できなくなります。Text プロパティの値は、サーバー側のコードで変更する場合を除き、次のポストバックが発生するまでビューステートに保存されます。


 セキュリティ上の措置ですね。ReadOnly なのだから、クライアントからポストされる値が、サーバから送り出した値と違っているのはおかしい、と。
 サーバに送信されるとあるので、リクエストクエリを直接読めば、書いてあるのかもしれません。


 ん?Server.Transfer すれば本当に処理する URL は隠れるし、CSRF 対策にもなる?

 まぁ、ViewState から復元した後、ポスト内容を反映するので(ここで ReadOnly なら、反映しないようにしているのでしょう)、ViewState を変更されていたらアウトなのですが。

〆 written by Jitta@わんくま同盟 on 2006/04/11
□ Microsoft MVP for Visual Developer ASP/ASP.NET October, 2005 - September, 2006
206
会議室デビュー日: 2006/04/11
投稿数: 4
投稿日時: 2006-04-12 10:26
引用:

Jittaさんの書き込み (2006-04-11 22:12) より:

 セキュリティ上の措置ですね。ReadOnly なのだから、クライアントからポストされる値が、サーバから送り出した値と違っているのはおかしい、と。
 サーバに送信されるとあるので、リクエストクエリを直接読めば、書いてあるのかもしれません。




ありがとうございます。

TextBox.Readonlyのプロパティは変わってないけど、サーバでの処理が変わり
本来のReadOnlyの意味合いどおりになったという感じでしょうか

「リクエストクエリを直接読めば」とアドバイスを頂いたのでやってみたところ
取得できました。

私のやった回避方法をあげときます。
=========================================
【1】AttributesでReadOnly

   ・サーバーコントロールのReadOnlyはfalse
   ・AttributesでReadOnlyを追加

   JavaScriptで変更したTextBox1の値をTextBox1.Textで取得できます。

【2】教えていただいたリクエストクエリ

   ・サーバーコントロールのReadOnlyはtrue
   
   TextBox1.Textで取得できないので、Request.Form.Item("TextBox1").ToStringで取得

===========================================

他にも方法がないか探してみます。
ありがとうございます。
1

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