無効化されたフォーム入力はリクエストに表示されません


339

フォームに無効な入力がいくつかあり、それらをサーバーに送信したいのですが、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>


2
@Liam出席率の低い質問を低品質の回答で締めくくるのは非常に奇妙な試みです。
hazzik

古いあまり出席した質問です。技術的には、この質問は、尋ねられたときに重複として閉じられるべきです。マージが発生する可能性がある場合と発生しない場合があるため、modでフラグを立てました。それは彼ら次第です。
リアム

@Liam実際には、いくつかの回答が似ていても、質問は異なります。「disabled」フィールドを作成して値を送信する方法について質問し、「reasons」について別の質問をします
hazzik

私がそれを解決しようと数時間を費やした後にのみ、ここに着きました。Ehhh ..
matcheek

回答:


728

disabled属性を持つ要素は送信されないか、その値が送信されていないと言うことができます(フォームデータセットの作成に関するHTML 5仕様のステップ3の2番目の箇条書きを参照)。

つまり、

<input type="textbox" name="Percentage" value="100" disabled="disabled" /> 

FYI、あたり17.12.1 HTML 4仕様で:

  1. 無効にされたコントロールはフォーカスを受け取りません。
  2. 無効化されたコントロールは、タブナビゲーションではスキップされます。
  3. 無効化されたコントロールは正常に送信できません。

readonlyケースで属性を使用できます。これを行うと、フィールドのデータを投稿できます。

つまり、

<input type="textbox" name="Percentage" value="100" readonly="readonly" />

FYI、あたり17.12.2 HTML 4仕様で:

  1. 読み取り専用要素はフォーカスを受け取りますが、ユーザーが変更することはできません。
  2. 読み取り専用の要素がタブナビゲーションに含まれています。
  3. 読み取り専用要素が正常に投稿されました。

8
私自身の質問に答えるには:いいえ、readonyは、type = 'text'およびtype = 'password'の<input />フォームコントロールと< textarea />に対してのみ機能します。readonlyは、ユーザーがコントロールの値を変更できないようにします。ユーザーがチェックボックス(またはラジオタイプの入力)の値を変更できないようにすることは、あまり意味がありません...
Muleskinner

3
@ danielson317選択要素を「無効」のままにして、同じ値を持つ別の非表示入力を追加することもできます。
AlphaMale、

1
@AlphaMaleただし、非表示要素に同じ名前を付けることはできません(または同じ名前にすることはできません)。要素を空にして、保存されたフォームの状態から元の値を削除することで、これを乗り越えました。readonlyは一部のフォームアイテムでは機能しないことに注意してください。
danielson317

2
あなたは何かを見つけて、「一体何が彼らにこれが明白だと思ったのか」と考えたことはありますか?無効または無効にできない入力フィールドを含めるという問題が発生した場合、それはユーザーに変更させたくない、つまり、まったく宣言されていないかのように効果的に機能する必要がないことを意味します。
Nick Bedford

1
これは役に立ち、回答と応答の両方に感謝します。
user1449249

24

Jqueryを使用してajaxでデータを送信すると、問題を解決できます。

<script>

$('#form_id').submit(function() {
    $("#input_disabled_id").prop('disabled', false);

    //Rest of code
    })
</script>

このソリューションについて+1の良いところは、入力超えるユーザー=)あなたはまだ赤い無効のアイコンを使用してできることである
JMASTER B

5
@ArielMaduroあなたはcssでそれを行うことができますcursor:not-allowed;
sricks

@sricksあら本当に?? 例を提供できますか?
JMASTER B 2016

無効にされたフィールドはフォーカスを受け取ることができないため、このソリューションのようにreadonlyを使用するだけではありません
Andreas

9

有効化された入力に加えて無効化された入力からの値を送信するには、フォームが送信されるときにフォームのすべての入力を再度有効化するだけです。

<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 -->
}

jqueryオプションの引用符の1つが欠落しています
cagcak

8

フィールドを無効にしてデータを渡す必要がある場合は、JavaScriptを使用して同じデータを非表示フィールドに入力できます(または非表示フィールドも設定します)。これにより、無効にすることができますが、別のページに投稿する場合でも、データを投稿できます。


1
このソリューションも私が使用してきたものですが、今学んだように、読み取り専用プロパティははるかに優れたソリューションです
Muleskinner '19

4

非常に便利なので、この回答を更新しています。readonlyを入力に追加するだけです。

したがって、フォームは次のようになります。

<form action="/Media/Add">
    <input type="hidden" name="Id" value="123" />
    <input type="textbox" name="Percentage" value="100" readonly/>
</form>

4

意味的にこれは正しい動作のように感じます

この値を送信する必要があるのはなぜですか?

フォームの入力が無効になっている場合、おそらくユーザーが値を直接変更したくない

無効な入力に表示される値は、

  1. フォームを生成したサーバー上の値からの出力、または
  2. フォームが動的である場合、フォーム上の他の入力から計算可能

フォームを処理するサーバーがフォームを処理するサーバーと同じであると仮定すると、無効化された入力の値を再現するためのすべての情報が処理時に利用可能である必要があります

実際、データの整合性を維持するには、無効な入力の値が処理サーバーに送信された場合でも、実際に検証する必要があります。この検証には、とにかく値を再現する必要があるのと同じレベルの情報が必要です。

私はほとんど読み取り専用の入力もリクエストで送信されるべきではないと主張します

修正してうれしいですが、読み取り専用/無効化された入力を送信する必要があると考えることができるすべてのユースケースは、実際には変装したスタイリングの問題です


1
値は
Chrome

2

私はこれがより簡単に機能すると思います。入力フィールドを読み取り専用にしてから、エンドユーザーが読み取り専用であることを認識できるようにスタイルを設定します。ここに配置された入力(たとえばAJAXから)は、追加のコードなしで送信できます。

<input readonly style="color: Grey; opacity: 1; ">

-6

無効化を完全に回避することができます。htmlフォーム形式は、関連する<p>ラベルやその他のラベルを送信しないため、これは苦痛です。

代わりに定期的に置くことができます

<input text tag just before you have `/>

これを追加 readonly="readonly"

それはあなたのテキストを無効にすることはありませんが、ユーザーによって変更されることはないので、それは同様に機能し<p>、フォームを通じて値を送信します。<p>タグのようにしたい場合は、境界線を削除します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.