以下发现可能有助于理解两者之间的差异:
顺从者
:在表单验证成功时调用-就在服务器回发之前
无效处理程序
:如果验证失败且没有回发,则调用
@DGreen的解决方案似乎绝对是在表单验证失败并且需要显示弹出式验证摘要等操作时注入特殊处理的最佳方式(
无效处理程序
)
$("form").bind("invalid-form.validate", function () {
alert('invalid!');
});
@如果要防止成功验证表单的回发,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。验证不引人注目的
负责为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。验证不引人注目的
像这样的处理者——但我不会打扰自己
$("form").unbind("invalid-form.validate"); // unbind default MS handler
如果你想知道为什么会这样
$("form").data("validator").settings.submitHandler = ...
这不管用
$("form").data("validator").settings.invalidHandler = ...
因为
submitHandler
被明确地称为“内部”
jquery。验证
当进行验证时。因此,设置在什么位置并不重要。
validator.settings.submitHandler.call( validator, validator.currentForm );
但是
invalidHandler
一定会在
init()
像这样,如果你在自己的代码中设置它,那就太晚了
if (this.settings.invalidHandler)
$(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
有时,代码中的一小步会让你了解很多!希望这有帮助
*确保未启用捆绑包中的缩小功能。