次の調査結果は、 の違いを理解するのに役立ちます。
submitHandler : フォームが正常に検証されたときに呼び出されます - サーバーのポストバックの直前に呼び出されます
invalidHandler : 検証が失敗し、ポストバックがない場合に呼び出されます
@DGreenのソリューションは、フォームの検証が失敗し、ポップアップ検証の概要を表示するなどの何かをする必要がある場合に、特別な処理を挿入するための最良の方法であるようです( invalidHandler )
$("form").bind("invalid-form.validate", function () {
alert('invalid!');
});
@PeteHaus ソリューションは、正常に検証されたフォーム ( submitHandler )のポストバックを防ぎたい場合に何かを行うための最良の方法です。
$("form").data("validator").settings.submitHandler = function (form) {
alert('submit'); form.submit(); };
.validate
ただし、このようなメソッドにバインドすることでオーバーライドしている (またはオーバーライドしていない) 動作と、それぞれの方法を異なる方法で行う必要がある理由について少し心配していました。ということでソースを確認。この手順をもっと理解したい人は誰でもそうするよう強くお勧めします - 'alert' ステートメントや 'debugger' ステートメントをいくつか入れてください。
とにかく、jquery.validate.unobtrusive
ハンドラーjquery.validate
がプラグインを初期化するとき、parseElement()
メソッドによって作成されたオプションを取得することにより、メソッドでそれを行うことがわかりますvalidationInfo()
。
ValidationInfo()
次のようなオプションを返します。
options: { // options structure passed to jQuery Validate's validate() method
errorClass: "input-validation-error",
errorElement: "span",
errorPlacement: $.proxy(onError, form),
invalidHandler: $.proxy(onErrors, form),
messages: {},
rules: {},
success: $.proxy(onSuccess, form)
},
のonErrors()
メソッドはjquery.validate.unobtrusive
、MVC の検証概要パネルを動的に作成する役割を果たします。検証サマリー パネルを作成していない場合 (@Html.ValidationSummary()
フォーム ボディ内に付随的に含める必要があります)、このメソッドは完全に不活性であり、何もしないため、心配する必要はありません。
function onErrors(event, validator) { // 'this' is the form elementz
var container = $(this).find("[data-valmsg-summary=true]"),
list = container.find("ul");
if (list && list.length && validator.errorList.length) {
list.empty();
container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
$.each(validator.errorList, function () {
$("<li />").html(this.message).appendTo(list);
});
}
}
本当にしたい場合は、jquery.validate.unobtrusive
このようにハンドラーのバインドを解除できます-しかし、私は気にしません
$("form").unbind("invalid-form.validate"); // unbind default MS handler
なぜこれが機能するのか疑問に思っているなら
$("form").data("validator").settings.submitHandler = ...
そしてこれはうまくいきません
$("form").data("validator").settings.invalidHandler = ...
これは、検証が実行されるときにsubmitHandler
内部で明示的に呼び出されるためです。jquery.validate
したがって、どの時点で設定されているかは問題ではありません。
validator.settings.submitHandler.call( validator, validator.currentForm );
しかし、このようinvalidHandler
にイベントにバインドされているため、独自のコードで設定すると手遅れになりますinit()
if (this.settings.invalidHandler)
$(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
コードを少しステップ実行すると、多くの理解が得られることがあります。お役に立てれば
*バンドルでミニフィケーションが有効になっていないことを確認してください。