以下发现可能有助于理解两者之间的区别:
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 这样的方法来覆盖(或不覆盖)什么行为 - 以及为什么我必须以不同的方式做每一种方式。所以我检查了来源。我强烈建议任何想进一步了解此过程的人也这样做 - 加入一些“警报”语句或“调试器”语句,这很容易理解*
无论如何,当jquery.validate.unobtrusive 处理程序初始化jquery.validate 插件时,它通过检索validationInfo() 方法创建的选项在parseElement() 方法中这样做。
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)
},
jquery.validate.unobtrusive 中的onErrors() 方法负责为 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);
有时,稍微单步执行代码会加深理解!希望这会有所帮助
*确保您没有启用捆绑包中的缩小功能。