如何验证JQuery unobstrusive验证中的单个元素和ASP.NET MVC中的JQuery Validate?

时间:2014-09-04 13:01:34

标签: jquery asp.net-mvc jquery-validate unobtrusive-validation

假设:

  1. 我的JQuery Unobstrusive验证和JQuery验证在我的ASP.NET MVC 5.2中正常工作
  2. 通过点击提交按钮进行常规验证工作正常。
  3. 我正在使用ASP.NET MVC验证摘要来显示错误。
  4. 现在,当我尝试使用以下方法调用单个元素验证时:

    form.validate().element(txtPostalCode)
    

    出现问题:

    1. 验证失败时,验证摘要中未显示任何错误消息。

    2. 验证成功后,我不断通过不引人注意的验证获得此错误。

    3. 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 个答案:

答案 0 :(得分:0)

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

  1. 我使用自定义showErrors方法来满足我的需求。
  2. 不管怎样,通过上面的第1点,我会破坏验证摘要中通常的不显眼验证行为,所以我需要将设置重置为默认值。
  3. 我愿意接受更优雅的解决方案,但下面的代码符合我的需求。

    谢谢!希望它有所帮助!

    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();
    }
    
相关问题