ASP.NET MVCで無効な入力を送信するにはどうすればよいですか?


108

ASP.NET MVCで無効な入力を送信するにはどうすればよいですか?


3
一般的には、質問を質問として表現し、回答を個別に投稿する必要があります。閉じる投票; 「回答」の部分を実際の回答に移動することをお勧めします。
ジョージストッカー2010

1
@Dhavalの投稿は、質問に無効な単語が含まれているため、正解です。
QMaster

回答:


160

readonly="readonly"代わりにフィールドを作成できませんdisabled="disabled"か?読み取り専用フィールドの値は、ユーザーが編集できない状態でサーバーに送信されます。SELECTタグは、しかし例外です。


1
readonlyは機能しますが、フィールドがグレー表示されません。これは私が使用している例です:<%: Html.TextBoxFor(model => model.p1, new { @readonly = "readonly" }) %>どうすればグレー表示にして、視覚的に編集できないように見えるのでしょうか。LabelForに似たものを使用した方がいいのですが、LabelForを試してみましたが、DisplayNameしか取得できません...
VoodooChild

22
4年間.net aspを実行していて、無効にされた入力が元に戻らないことを知りませんでした。無効になっている選択とそのすべての並べ替えの非表示フィールドを含めるだけです(許可されていないフォームでIDが繰り返されている場合でも)
Piotr Kula

5
これはtype="checkbox"入力に対しても機能しません
ネイサン

1
私はラジオボタンで同じことをしようとしていますが、読み取り専用はそれらに動作しないようです。
Randy R

38

皆に感謝します:

私がこれを解決した方法:

document.getElementById("Costo").readOnly = true;
document.getElementById("Costo").style.color = "#c0c0c0";

注意:

私は答えでこの情報を得ましたが、私は編集されました。


1
これは私にとってはうまくいきませんでした(このSOリンクのおかげでそれがわかりました)。これは機能しました:textBox.Attributes.Add("readonly", "readonly");説明はリンクにあります
brian-d

これは私にとってより理にかなっているので、あなたがそれを編集したのは良いことです。
Yawar

readonlyは行く方法のようです。コントロールを戻さないなどの奇妙なことはしませんが、編集はできません。ムシャスグラシアス!
Mariusz

Michael Brenntのコメントに追加すると、jQueryを使用している場合、2行目はになり$("#textBoxId").css("color", "#c0c0c0")ます。
F1Krazy

30

@ppumkinはこの回答についての彼のコメントでこれについて言及しましたが、障害者からのデータの送信に関する他のリソースを見つけることができなかったので、それを強調したいと思いました<select>。また、selectは<input>sではなく「入力」であるため、問題に関連していると思います。

無効になっている選択とそのすべての並べ替えの非表示フィールドを含めるだけです。

例:

@Html.DropDownListFor(model => model.SelectedID, ... , new { disabled = "disabled"}) @* Won't be posted back *@
@Html.HiddenFor(model => model.SelectedID) @* Will be posted back *@

注意:これにより、同じIDを持つ2つのタグがページに配置されます。これは実際には有効なHTMLではなく、JavaScriptで問題を引き起こす可能性があります。私にとっては、ドロップダウンの値をhtml idで設定するJavaScriptがあり、非表示フィールドを最初に配置すると、JavaScriptはの代わりにそれを見つけますselect


20

通常、「読み取り専用」であるがサーバーに送信する必要があるフィールドがある場合は、表示を無効(または単にテキスト)にしますが、同じ名前の非表示フィールドを追加します。フィールドがサーバー側で実際に変更されていないことを確認する必要があります。アクションのモデルからフィールドを更新しないでください。ただし、エラーがある場合でもモデルの状態は正確です。


はい、私はあなたが何をしているのかを考えていました。しかし、もっと多くの変数を処理する必要があったでしょう。私の投稿がGoogleに表示される可能性があることを願っています。簡単な解決策を探して、人々は苦しむ必要はありません。
Sanchitos、2010

4
ソリューションの問題の1つは、JavaScriptが無効になっていると機能しないことです。非表示フィールドをサーバー側に挿入しても、この問題は発生しません。
tvanfosson 2010

15

フォームが送信される前に、次のようなコードを使用することもできます。

$(":disabled", $('#frmMain')).removeAttr("disabled");

2
私はこれを使用しました。非表示の要素について心配する必要はありません。不利な点があるかどうかはわかりませんが、js関数によるポストバックのわずかな遅延を除いて
IronHide

2
読み取り専用ではなく無効化の使用について述べた多くの回答に対して、無効化を使用する必要がある場合が多いと思います。同様の質問で15件の回答を読み、独自のjQueryフィルターでこれを選択して、適切な要素を選択して無効化された属性を削除しました。ありがとう。
QMaster

で提出する場合はどうなりますAjax.BeginFormか?
markzzz 2018年


1
少し奇妙に見えますが、それが私のために働いた唯一の解決策でした...
AGuyCalledGerald

8

設計上、ブラウザはそれをサポートしていません。

それらを作るのいずれかのreadonlyサーバ、またはまだと使用可能なコントロールとしている取引場合は値を提出することができますどのreadonlyように選択し、追加のCSSスタイルとして属性pointer-events: none;、それらを非インタラクティブにするために

ハックのようなものですが、動作します!また、JavaScriptを使用せずに送信ボタンで直接フォームを送信する場合にも機能します。追加の作業は必要ありません!

例えば:

<select asp-for="TypeId" 
   asp-items="@(new SelectList(await TypeRepository.FetchTypesAsync(), "TypeId", "Name"))"
   class="form-control form-control-sm" 
   readonly 
   style="pointer-events: none;">
</select>

6

以下のようなエディターテンプレートを作成できます

CSS

.disabled {
    background-color:lightgray;
}

エディターテンプレート

@model string
@Html.TextBoxFor(x => x,new {@class="disabled", @readonly=true })


1

Tasosを展開する( ":disabled"、$( '#xxxForm'))。removeAttr( "disabled"); あなたは使うことができます:

$("#xxxForm").submit(function (e) {
    e.preventDefault();
    var form = this;
    $('#Field1')[0].disabled = false;
    $('#Field2')[0].disabled = false;
    ...
    $('#FieldN')[0].disabled = false;
    form.submit(); // submit bypassing the jQuery bound event
});


0

無効にすると値が失われるため、通常はCheckBoxまたはCheckBoxForにこの方法を使用します。読み取り専用はチェックボックスでも機能しません。

@Html.DisplayFor(m => m.Order.Transfer)
@Html.HiddenFor(m => m.Order.Transfer)

0

このスクリプトをページの@sectionスクリプトに配置するだけです。これにより、ページを送信するときに入力が有効になります。送信後にユーザーを別のページにリダイレクトする必要があります。

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js">
$("form").submit(function () {
                    if ($('form').valid()) {
                        $("input").removeAttr("disabled");
                    }
                });
</script>


-3

そのビューにリンクされているViewModelでそのプロパティを[必須]にするだけです。

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