如何在JQuery无结构验证和ASP.NET MVC中验证JQuery validate中的单个元素



假设:

  1. JQuery Unobstructive验证和JQuery验证在我的ASP.NET MVC 5.2中运行良好
  2. 通过点击提交按钮进行的常规验证工作正常
  3. 我正在使用ASP.NET MVC验证摘要来显示错误

现在,当我尝试使用以下方法调用单个元素验证时:

form.validate().element(txtPostalCode)

出现问题:

  1. 验证失败时,验证摘要中不会显示错误消息。

  2. 当验证成功时,我不断地从非结构性验证中得到这个错误。

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"),**

你知道如何做到这一点吗?基本上,我想做的是验证一个元素,并在验证摘要中显示错误(如果有的话)。

谢谢!

我就是这么做的。它解决了我的问题。所以基本上,

  1. 我使用自定义showErrors方法来满足我的需要
  2. 不知怎的,通过执行上面的第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();
}

最新更新