2009-04-29 28 views
4

JavaScriptを使用してクライアント側の値を編集中のTextBoxが無効になっています。サーバー側で値を取得しようとすると、クライアント側で行われた変更が反映されません。 TextBoxのenabled属性をtrueに設定すると、値を取得できますが、ユーザーはフォーカスを置いてTextBoxを編集できます。aspの値を取得する:TextBox

ユーザーがTextBoxにフォーカスと編集を行わないようにするには元気な方法はありますか?

答えて

5

ブラウザは、バック無効入力コントロールの値を投稿しないでください。おそらく、これを回避する最も簡単な方法は、フォームの送信にフックし、フォームが送信されるときに入力を再度有効にすることです。ユーザーは値を編集する機会を得ることができず、残りのリクエストとともに投稿されるはずです。

隠し要素をフォームに挿入する方法もあります。これは、あなたのスクリプトによって維持されるか、表示された値をミラーリングするか、または最後に追加されるかのいずれかである可能性があります。

+0

私がやったのは、ロブの提案でした。私はasp:HiddenFieldをページに追加しました。 JavaScriptがクライアント側のTextBoxの値を変更すると、HiddenFieldの値も変更されました。新しい値は、サーバー側でHiddenFieldを介してアクセス可能でした。 それは畳み込まれたものですが、なぜブラウンフィールドと呼ばれるのでしょうか。 – Slim

6

テキストボックスのReadOnlyプロパティを使用します。

:OPのコメントに基づいて、これはおそらくトリックを行いません。 DotNetSlackersから:

編集2

したがって、これら 二つの性質の違いは何だと理由の両方が存在するのですか? これら二つの特性、自明 差微妙、深い一方との間の2つの違いがあります

  1. 二つの特性が異なるマークアップを発します。 Enabled をFalseに設定すると、TextBoxはレンダリングされたHTML に 属性disabled = "無効"を挿入します。 ReadOnlyプロパティをTrueに設定すると、 の属性readonly = "readonly"は が注入されます。
  2. HTMLフォームのW3C仕様によれば、無効化されたコントロールは「成功」であり、読み取り専用コントロール は「成功」する可能性があります。 「成功」 コントロールの名前/値のペア は、 POSTヘッダーまたはクエリ文字列を介してブラウザに返されます。 したがって、無効なコントロールは がASP.NETページに戻されるのではなく、 の読み取り専用コントロールがユーザーエージェントの に依存します。 (私のテストでは、両方の IE 6およびFirefox 1.5のは 読み取り専用のTextBox入力に沿って送信してください。)

......

をあなたは ASP.NETバージョン1でこの問題が発生した場合.xの場合、 がTextBoxのReadOnlyプロパティー を見つけて、 をFalseに設定する代わりに使用している可能性があります。あなたはまだ ページのViewStateは無効になっていると TextBoxの値が読み取り専用 コントロールの フォーム送信を通じて送り返されるので、プログラム 読み取り専用のTextBox WebコントロールのTextプロパティ を設定することができます。しかし、ASP.NETバージョン 2.0では、Rick Strahlin氏のブログエントリ ASP.NET 2.0 ReadOnlyの動作の変更 のように、EnableViewStateがfalseの場合は少し変化します。 2.0では、TextBoxコントロールのReadOnlyプロパティの動作が少し変更されました 。技術的なドキュメントから:

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

何が起こるかは、クライアントがフォームの値による読み取り専用 のTextBoxの値に沿って を送信していることですが、 ASP.NET 2.0エンジンは、価値 を取り、テキストにそれを割り当てることはありません。 へのポストバック時のTextBoxの プロパティは、悪意のあるユーザーからの保護を支援します 読み取り専用テキストボックス値 を変更します。しかし、これは我々の以前の問題 に戻ります。値 がポストバックで指定されていない場合(またはこの場合は が無視されています)、ViewState が無効になっていると値が失われます。 Eep。 、セキュリティ上のリスクをもたらすと 問題を導入する。

Rick'sworkaroundだけ手動 要求からヘッダー(この.TextBox1.Text = リクエスト[this.TextBox1.UniqueID])の値を読み取ることでしたそれは2.0 アドレスになります。最適な方法は データベースからの値を再クエリすることです (または プログラムで設定された 読み取り専用テキストボックスの値を最初に取得した場所)。

このブログの記事の教訓は、あなたが読み取り専用 場合は 無効または読み取り専用のフォームのいずれか フィールドを使用することができ、データを、本当にあなたが 値をバック受け取る か否かの問題ではないということですフォームの 提出のフォームフィールドの の場合は、 を信頼する/使用しないでください。 を使用してください。読み取り専用のデータを持っている場合は、 は、エンドユーザが修正できるデータストリーム から再読み取りしません!あなたが発見したとして

Source

+0

テキストボックスのreadonlyプロパティをTrueに設定すると、有効になりますがユーザー入力からブロックされます。 – TheTXI

+0

ReadOnlyをfalseに設定すると、enabledがfalseに設定されます。 – Slim

+0

そうだとすれば、私はReadOnlyプロパティのために多くの敬意を払っています。 – TheTXI

関連する問題