假设:
- JQuery Unobstructive验证和JQuery验证在我的ASP.NET MVC 5.2中运行良好
- 通过点击提交按钮进行的常规验证工作正常
- 我正在使用ASP.NET MVC验证摘要来显示错误
现在,当我尝试使用以下方法调用单个元素验证时:
form.validate().element(txtPostalCode)
出现问题:
验证失败时,验证摘要中不会显示错误消息。
当验证成功时,我不断地从非结构性验证中得到这个错误。
Uncaught TypeError: Cannot read property 'attr' of undefined
要进一步挖掘粗体代码:
function onSuccess(error) { // 'this' is the form element
var container = error.data("unobtrusiveContainer"),
**replaceAttrValue = container.attr("data-valmsg-replace"),**
你知道如何做到这一点吗?基本上,我想做的是验证一个元素,并在验证摘要中显示错误(如果有的话)。
谢谢!
我就是这么做的。它解决了我的问题。所以基本上,
- 我使用自定义showErrors方法来满足我的需要
- 不知怎的,通过执行上面的第1点,我会破坏验证摘要上无干扰验证的通常行为,所以我需要将设置重置为默认设置
我对更优雅的解决方案持开放态度,但下面的代码适合我的需求。
谢谢!希望它能有所帮助!
var valSummary = $(".validation-summary");
var settings = $.data($('form')[0], 'validator').settings;
var ulSummary = valSummary.find("ul");
ulSummary.empty();
settings.showErrors = $.noop();
settings.showErrors = function (errorMap, errorList) {
for (var i = 0; i < errorList.length; i++) {
var liControl = $("<li />", {
"text": errorList[i].message
});
var checkDuplicate = ulSummary.filter(function (idx, elem) {
return $.trim($(elem).html()) === $.trim(liControl.html());
});
if (checkDuplicate.length === 0) {
ulSummary.append(liControl);
}
}
valSummary.show();
}
if (txtPostalCode.valid() && txtUnitNo.valid()) {
valSummary.hide();
RefreshValidationRules();
}
else {
settings.showErrors = $.noop();
return;
}
function RefreshValidationRules() {
$("form").removeData("validator");
$("form").removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse("form");
UnsetFocusInvalid();
}
function UnsetFocusInvalid() {
var settings = $.data($('form')[0], 'validator').settings;
settings.focusInvalid = false;
settings.onfocusout = $.noop();
}