控えめな検証が動的コンテンツで機能しない


96

控えめなjquery検証で、AJAX呼び出しを介して動的に読み込まれる部分的なビューを処理しようとして問題が発生しています。

私は何日もかけて、このコードを運が悪ければ動作するようにしてきました。

これがビューです:

@model MvcApplication2.Models.test

@using (Html.BeginForm())
{
 @Html.ValidationSummary(true);
 <div id="res"></div>
 <input id="submit" type="submit" value="submit" />
}

パーシャルビュー:

@model MvcApplication2.Models.test

@Html.TextAreaFor(m => m.MyProperty);
@Html.ValidationMessageFor(m => m.MyProperty);

<script type="text/javascript" >
  $.validator.unobtrusive.parse(document);
</script>

モデル:

  public class test
  {
    [Required(ErrorMessage= "required field")]
    public int MyProperty { get; set; }
  }

コントローラー:

    public ActionResult GetView()
    {
        return PartialView("Test");
    }

そして最後に、javascript:

$(doument).ready(function () {
$.ajax({
    url: '/test/getview',
    success: function (res) {

        $("#res").html(res);
        $.validator.unobtrusive.parse($("#res"));
    }
});

$("#submit").click(function () {
    if ($("form").valid()) {
        alert('valid');
        return true;
    } else {
        alert('not valid');
        return false;
    }
});

検証は機能しません。texboxに情報を何も入力しなくても、送信イベントはアラート( 'valid')を表示します。

ただし、ビューを動的にロードする代わり@Html.Partial("test", Model)に、メインビューで部分ビューをレンダリングするために使用する場合(そして、AJAX呼び出しを行わない場合)、検証は正常に機能します。

これは、コンテンツを動的にロードした場合、コントロールがDOMにまだ存在していないためと考えられます。しかし$.validator.unobtrusive.parse($("#res")); 、新しくロードされたコントロールについてバリデーターをさせるのに十分なはずの呼び出しをして います...

誰か助けてもらえますか?


私も同じ問題を抱えていたが、としてMVC 2で、私は一歩一歩を経る:weblogs.asp.net/imranbaloch/archive/2010/07/11/...は、これはまた、あなたを助けるかもしれません。weblogs.asp.net/imranbaloch/archive/2011/03/05/…この助けを願っています:)
Naresh Parmar

2
このunobtrusive.parse関数は、要素ではなくセレクターを引数として取ります。
フレッド、

回答:


226

すでに解析されているフォームを解析しようとしても、更新されません

動的要素をフォームに追加するときにできることは、次のいずれかです。

  1. フォームの検証を削除して、次のように再検証できます。

    var form = $(formSelector)
        .removeData("validator") /* added by the raw jquery.validate plugin */
        .removeData("unobtrusiveValidation");  /* added by the jquery unobtrusive plugin*/
    
    $.validator.unobtrusive.parse(form);
  2. unobtrusiveValidationjquery dataメソッドを使用してフォームのデータにアクセスします。

    $(form).data('unobtrusiveValidation')

    次に、ルールコレクションにアクセスし、新しい要素の属性を追加します(これはやや複雑です)。

フォームに動的要素を追加するために使用されるプラグインのASP.Net MVCの動的コンテンツへの控えめなjquery検証の適用に関するこの記事も確認できます。このプラグインは2番目のソリューションを使用します。


17
あなたはロックです、完全に私の日を救いました!素晴らしい答え!
Dimitar Dimitrov

一人で誘うのが怖かったです。そのページのスクリプトは魅力のように機能します。
cezarypiatek 2014年

コード、問題なく動作-迅速な更新(可能であれば)1.ノックアウトを使用していて、フィールドの名前をうまく取得しているので、問題のように見えます。$ .validator.unobtrusive.parseDynamicContent( 'form'); (すべてのフィールドを取得するため)、送信時に最後に。2.これはjohnnyreilly.github.io/jQuery.Validation.Unobtrusive.Native/…で、フィールドに名前を付ける方法を提供します(これは必須のようです。他の2つの上にjquery unbtrusiveブートストラップを使用しているので、状況はおそらく異なる)
リチャード・ハシャム

適用したフォーム固有の設定は、フォームを再解析すると、$("form").data("validator").settingsによって削除され$(formSelector).removeData("validator")、デフォルトから置き換えられることに注意してください$.validator.defaults。これは動的フィールドを含めるのに最適な方法ですが、新しい解析ごとにカスタム初期化コードを繰り返すようにしてください。
KyleMit 2017

19

ナディーム・ケドルの答えへの追加として...

フォームを動的にDOMにロードしてから呼び出した場合

jQuery.validator.unobtrusive.parse(form); 

(追加のビットが言及されています)、その後ajaxを使用してそのフォームを送信します

$(form).valid()

フォームを送信する前にtrueまたはfalseを返します(実際の検証を実行します)。


こんにちは、私は同じ問題に直面しています。ポップアップ(jqueryダイアログ)に動的ビューを表示しています。控えめな検証が機能していません。動的ビューのどこで$(form).valid()を呼び出すか、他のどこで呼び出すか?
mmssaann 2013

AJAX送信を行っていたため、$(form).submit内でfalseを返すことでフォームの送信を常に防止していましたが、検証が失敗したときにAJAX送信を呼び出さない方法が必要でした。$(form).valid()が答えです!ありがとうございました!
jgerman

6

これを_Layout.cshtmlに追加します

 $(function () {
        //parsing the unobtrusive attributes when we get content via ajax
        $(document).ajaxComplete(function () {
            $.validator.unobtrusive.parse(document);
        });
    });

3
これは特に非効率的です。
リアム2015年

5

驚いたことに、この質問を表示したとき、公式のASP.NETドキュメントには、控えめなparse()方法や動的コンテンツでの使用方法に関する情報がまだありませんでした。私はドキュメントリポジトリで問題を作成し(@Nadeemの元の回答を参照)、プルリクエストを送信してそれを修正する自由を手にしました。この情報は、モデル検証トピックのクライアント側検証セクションに表示されます


3

これをテストしてください:

if ($.validator.unobtrusive != undefined) {
    $.validator.unobtrusive.parse("form");
}

2

私は同じ問題に悩まされ、これ以外は何もうまくいきませんでした:

$(document).ready(function () { 
    rebindvalidators();
});

function rebindvalidators() {
    var $form = $("#id-of-form");
    $form.unbind();
    $form.data("validator", null);
    $.validator.unobtrusive.parse($form);
    $form.validate($form.data("unobtrusiveValidation").options);
}

そして追加

// Check if the form is valid
var $form = $(this.form);
if (!$form.valid())
    return;

フォームを保存しようとしている場所。

Ajax呼び出しでフォームを保存していました。

これが誰かを助けることを願っています。


1
これは私に働いています。私は過去数日間の解決策を見つけていました、それはasp.netコア2で動作します。ありがとう。
Pradip Rupareliya

0

このコードをモーダルコードの最後にもう一度コピーしてください

    <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

;)

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