無効化された入力がフォームにあり、それらをサーバーに送信したいのですが、Chromeはそれらを要求から除外します。
隠しフィールドを追加せずにこれを回避する方法はありますか?
<form action="/Media/Add">
<input type="hidden" name="Id" value="123" />
<!-- this does not appear in request -->
<input type="textbox" name="Percentage" value="100" disabled="disabled" />
</form>
Disabled属性を持つ要素は送信されないか、それらの値は送信されないと言えます( フォームデータセットを構築するための仕様 の手順3の2番目の箇条書きを参照)。
すなわち、
<input type="textbox" name="Percentage" value="100" disabled="disabled" />
ちなみに、
あなたのケースでreadonly
属性を使うことができます、これをすることによってあなたはあなたのフィールドのデータを投稿することができるでしょう。
すなわち、
<input type="textbox" name="Percentage" value="100" readonly="readonly" />
ちなみに、
Jqueryを使用してajaxでデータを送信すると、問題を解決できます。
<script>
$('#form_id').submit(function() {
$("#input_disabled_id").prop('disabled', false);
//Rest of code
})
</script>
有効な入力に加えて無効な入力から値を転記するには、フォームの送信時にそのフォームのすべての入力を再度有効にすることができます。
<form onsubmit="this.querySelectorAll('input').forEach(i => i.disabled = false)">
<!-- Re-enable all input elements on submit so they are all posted,
even if currently disabled. -->
<!-- form content with input elements -->
</form>
あなたがjQueryを好めば:
<form onsubmit="$(this).find('input').prop('disabled', false)">
<!-- Re-enable all input elements on submit so they are all posted,
even if currently disabled. -->
<!-- form content with input elements -->
</form>
ASP.NET MVC C#Razorの場合は、次のように送信ハンドラを追加します。
using (Html.BeginForm("ActionName", "ControllerName", FormMethod.Post,
// Re-enable all input elements on submit so they are all posted, even if currently disabled.
new { onsubmit = "this.querySelectorAll('input').forEach(i => i.disabled = false)" } ))
{
<!-- form content with input elements -->
}
フィールドを無効にしてデータを渡す必要がある場合は、JavaScriptを使用して同じデータを隠しフィールドに入力します(または単に隠しフィールドも設定します)。これにより、無効にすることができますが、他のページに投稿している場合でもデータを投稿することができます。
非常に便利なので、私はこの答えを更新しています。入力にreadonlyを追加するだけです。
したがって、形式は次のようになります。
<form action="/Media/Add">
<input type="hidden" name="Id" value="123" />
<input type="textbox" name="Percentage" value="100" readonly/>
</form>
私はこれがより簡単だと思います。入力フィールドのみを読み取り専用にしてから、エンドユーザーが読み取り専用であることがわかるようにスタイルを設定します。ここに配置された入力(AJAXなど)は、追加コードなしで送信できます。
<input readonly style="color: Grey; opacity: 1; ">
意味的にこれは正しい振る舞いのように感じます
「この値を送信する必要があるのはなぜですか。」
もしあなたがフォームに対して無効な入力をしているのなら、おそらくユーザーに直接値を変更させたくないでしょう。
無効な入力に表示される値はいずれも
フォームを処理するサーバーがそのフォームを処理するサーバーと同じであると仮定すると、無効化された入力の値を再現するためのすべての情報は処理時に使用可能になるはずです。
実際には、データの整合性を保つために - 無効な入力の値が処理サーバーに送信された場合でも、実際に検証する必要があります。 この検証には、とにかく値を再現する必要があるのと同じレベルの情報が必要です。
私はほとんど読み取り専用の入力もリクエストで送信されるべきではないと主張したい
是非とも修正してくださいすべての使用例読み取り専用または無効にした入力を送信する必要がある場所は、単にスタイルの問題にすぎません。変装