以下发现可能有助于理解 之间的区别:
submitHandler:在表单验证成功时调用 - 就在服务器回发之前
invalidHandler:如果验证失败并且没有回发则调用
如果表单验证失败并且您需要执行诸如显示弹出验证摘要(invalidHandler)之类的操作,@DGreen 的解决方案似乎绝对是注入特殊处理的最佳方式
$("form").bind("invalid-form.validate", function () {
alert('invalid!');
});
如果您想防止回发成功验证的表单(submitHandler) ,@PeteHaus 解决方案是最好的方法
$("form").data("validator").settings.submitHandler = function (form) {
alert('submit'); form.submit(); };
但是,我有点担心通过绑定到这样的.validate
方法来覆盖(或不覆盖)什么行为 - 以及为什么我必须以不同的方式做每一种方式。所以我检查了来源。我强烈建议任何想进一步了解此过程的人也这样做 - 放入一些“警报”语句或“调试器”语句,这很容易理解*
无论如何,事实证明,当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()
必须附带包含在 FORM 正文中),那么此方法是完全惰性的并且什么也不做,因此您无需担心。
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);
有时,稍微单步执行代码会产生很多理解!希望这可以帮助
*确保您没有启用捆绑包中的缩小功能。