0

目立たない検証を有効にして ASP.NET MVC を使用しているときに、ID を非表示フィールドとして Razor フォームに埋め込む必要が何度もありました。常に検証メッセージを含めることを学びました。たとえば、次のようになります。

@Html.HiddenFor(x => x.ParentId)
@Html.ValidationMessageFor(x => x.ParentId)

検証メッセージが省略されていると、送信時に JavaScript エラーがトリガーされます。これは、非表示フィールドにはデフォルトで、対応する検証エラー メッセージを必要とする目立たない検証属性が含まれているためです。フィールドを手作業でコーディングすることで、探している html 出力を取得できることがわかりました。

<input data-val="false" id="ParentId" name="ParentId" type="hidden" value="@Model.ParentId" />

しかし、このアプローチを取ると、InputExtensions.HiddenForヘルパー メソッドを使用する利点が失われます。JavaScript エラーを生成せずに拡張メソッドを単純に使用する方法はありますか?

編集:

これは jquery 検証の問題でした。私の jquery validate スクリプトはバージョン 1.8.1 のままでした (以下の注を参照)。手動で jquery.validate 1.11.1 に更新すると、問題はなくなりました。

:

jQuery 検証が更新されなかった理由は、元の jquery 検証 1.8.1 スクリプトが NuGet によってインストールされなかったためです。このシナリオでは、NuGet はライブラリを検出して更新を提案しますが、更新が実行されても元のスクリプトは置き換えられません。これは、NuGet によって致命的ではない警告として扱われます。教訓: NuGet の出力をすべて読んでください。

4

2 に答える 2

0

私は質問を理解したと思いますが、何かを見逃しているかもしれません。関連するレコードの ID を保持するために非表示フィールドを使用しており、バリデーターのアプローチを使用したことはありません。

IDを保持するために非表示を使用する必要がある場合は、それをユーザーに表示してその値を変更させたくない/必要がないためです...したがって、バリデーターは必要ありません。

このフィールドが必須であり、ユーザーが入力できないため... このフィールドが欠落している場合は予期しない状況であり、例外と同様に処理する必要があります (ユーザーがエラーの原因を開示しないため) Firebug を使用して html を変更しようとするか、投稿を作成します)。

ロジック (JS/Razor) で非表示に何かを配置できるが、場合によってはそこに null を配置する必要がある場合、ID は通常 1 から始まるため、0 から負の値までの数値を使用して null 値を表すことができます。次に、値を投稿してコントローラーでチェックを行うことができます。このアプローチを使用する場合、バリデータ ロジックを使用することもできます。

于 2013-04-22T23:14:44.417 に答える
0

あなたはこれについて間違っています。

このコードは完全に正常に動作します:

@model MyViewModel;

@using(BeginForm()) {
    @Html.HiddenFor(m => m.HiddenId)
    @Html.TextBoxFor(m => m.TextField);
    <input type="submit" />
}

モデル:

public class MyViewModel {
    public int HiddenId {get;set;}
    public string TextField {get;set;}
}

アクションメソッド:

public ActionResult Index() {
    return View(new MyViewModel { HiddenId = 1, 
                TextField = "We Don't need no steekin Validation Messages" });
}

[HttpPost]
public ActionResult Index(MyViewModel model) {
    if (ModelState.IsValid) {
         return Content("It's Valid!");
    }

    return View(model);
}
于 2013-04-23T00:02:51.823 に答える