4

私は部分的なビューを持っています:

 @Html.EditorFor(model => model.BM)
 @Html.ValidationMessageFor(model => model.BM)

メインビューで、私が行う場合:

@using (Html.BeginForm())
{
   @Html.Partial("QuoteStep1", Model)
}

次に、$('form')。validate()を呼び出すとフォームが検証され、データを入力しないとエラーメッセージが表示されます。

ただし、代わりにAJAX呼び出しを使用して部分ビューをロードした場合、$('form')。validate()の呼び出しは引き続き機能します(trueまたはfalseを正しく返します)が、エラーメッセージは表示されなくなります。

部分ビューの上部に次を追加する必要があることをどこかで読みました。

@if (this.ViewContext.FormContext == null) 
{
   this.ViewContext.FormContext = new FormContext(); 
 }

しかし、それはまったく効果がありません。

[編集:私の研究の更新]

2時間以上のデバッグの後、私はいくつかのことを発見しました。まず、AJAXリクエストを使用してフォームのコンテンツを読み込むため、新しく追加されたHTMLコントロールはDOMの一部ではありません。したがって、jqueryバリデーターがこれらのコントロールについて知る方法はありません。

したがって、AJAX成功コールバックに次のコード行を追加すると、トリックを実行する必要があります。

$.validator.unobtrusive.parse($('form'));

これは、AJAXの結果がDOMに追加された直後に設定されます。

バリデーターをさらにデバッグすると、次のコードが呼び出されていることがわかります。

 $(selector).find(":input[data-val=true]").each(function () {
            $jQval.unobtrusive.parseElement(this, true);
        });

つまり、新しく追加された入力ボックスが見つかりました。

$ jQval.unobtrusive.parseElementメソッドでは、次のコードがヒットします。

 this.adapt({
                    element: element,
                    form: form,
                    message: message,
                    params: paramValues,
                    rules: rules,
                    messages: messages
                }); 

要素は私のテキストボックスで、フォームは表示フォームで、メッセージは「BMは数字でなければなりません」です。だから、すべてが私には良さそうです。

しかし、何を推測してください...検証エラーメッセージはまだ表示されません!

助けてくれるjqueryの第一人者はいますか?:)

4

1 に答える 1