17

ASP.net MVC 3 には次のビューがあります。

@model Models.CreateProjectViewModel

<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>

@using( Html.BeginForm() ) {
    @Html.TextBoxFor(m => m.ProjectName)
    @Html.ValidationMessageFor(m => m.ProjectName)

    <p>
        <input type="submit" value="Save" />
    </p>
}

jQuery と Fluent Validation フレームワークで目立たない JavaScript を使用しています。

[保存] ボタンをクリックして検証が失敗した場合、カスタム JavaScript を呼び出すためにフックできるイベントはありますか?

function validationFailed() {
    // do something here only if validation failed
}

検証が失敗した場合 (失敗した場合のみ)、validationFailed() 関数を呼び出すことができるように、検証にどのように結び付けるか。

4

2 に答える 2

36

jQuery/Validation docs が言うように、無効なフォームが送信されたときに、invalidHandlerを使用して対応できます。

ただし、MVC の目立たない検証は Validation 自体をインスタンス化するため、後でこのイベントをフックする必要があります。

jQuery/Validation とまったく同じメカニズムを使用して、コードをフォーム要素のカスタム イベント ' invalid-form.validate ' にバインドできます。これは、無効なハンドラに対応します。

$(document).ready(function() {
    $('#myform').bind('invalid-form.validate',function(){
        alert('invalid form!');
    });
});

フォームに id を使用するには:

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myform" })) {
} 

アップデート:

既存の検証オブジェクトを取得する別の方法は、フォームでvalidate()を呼び出すことです。このフォームのバリデータがすでに作成されている場合は、以下が返されます。

編集:初期化が発生した後、変更.settings.invalidHandlerはバインディングには遅すぎます。したがって、バリデーターを再初期化しない限り、次のスニペットは [もう] 機能しません。

$(document).ready(function() {
    var existingValdiation = $("#myform").validate();
    //the settings property corresponds to the options parameter
    existingValdiation.settings.invalidHandler = function (form) {
        alert('invalid form!');
    };
    // not recommended:
    // re-init would bind settings.invalidHandler to 'invalid-form.validate'
    // existingValdiation.init();
});
于 2011-10-08T18:09:11.657 に答える
4

を使用できますinvalidHandler。それはjqueryの検証にあると思います。

invalidHandler Callback
無効なフォームが送信されたときのカスタム コードのコールバック。イベント オブジェクトを最初の引数として、バリデータを 2 番目の引数として呼び出します。

于 2011-10-04T17:18:10.017 に答える