Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 ASP.NET MVC 3不引人注目的Jquery验证不会多次显示自定义错误消息_Asp.net Mvc 3_Jquery Validate_Unobtrusive Validation - Fatal编程技术网

Asp.net mvc 3 ASP.NET MVC 3不引人注目的Jquery验证不会多次显示自定义错误消息

Asp.net mvc 3 ASP.NET MVC 3不引人注目的Jquery验证不会多次显示自定义错误消息,asp.net-mvc-3,jquery-validate,unobtrusive-validation,Asp.net Mvc 3,Jquery Validate,Unobtrusive Validation,因此,我从中获取了一些代码,这些代码允许我使用jquery validate unobtrusive库解析从服务器返回的验证错误消息,并将它们显示在UI中。他们有一个共同的目标。下面是我正在使用的一段Javascript代码: $.validator.addMethod("failure", function () { return false; }); $.validator.unobtrusive.adapters.addBool("failure"); $.valid

因此,我从中获取了一些代码,这些代码允许我使用jquery validate unobtrusive库解析从服务器返回的验证错误消息,并将它们显示在UI中。他们有一个共同的目标。下面是我正在使用的一段Javascript代码:

   $.validator.addMethod("failure", function () { return false; });
    $.validator.unobtrusive.adapters.addBool("failure");
    $.validator.unobtrusive.revalidate = function (form, validationResult) {
        $.removeData(form[0], 'validator');
        var serverValidationErrors = [];
        for (var property in validationResult) {
            //var elementId = property.toLowerCase();
            var item = form.find('#' + property);
            if (item.length < 1) { item = form.find('#' + property.replace('.', '_')); }
            serverValidationErrors.push(item);
            item.attr('data-val-failure', validationResult[property].join(', '));
            jQuery.validator.unobtrusive.parseElement(item[0]);
        }
        form.valid();
        $.removeData(form[0], 'validator');
        $.each(serverValidationErrors, function () {
            this.removeAttr('data-val-failure');
            jQuery.validator.unobtrusive.parseElement(this[0]);
        });
    };
其中PhysicalAddress.CityName是我的viewmodel属性和html输入字段的名称。因此,它知道将验证消息放在正确的html元素旁边

这一次有效。然后,当他们再次点击submit时,我的代码再次调用unobtrusive.revalidate方法。。它不起作用。它只显示一次验证消息,之后验证消息将永久消失

有人知道为什么会发生这种情况吗?。。我使用了revalidate方法,没有抛出任何错误,一切看起来都应该正常。。但出于某种原因,不引人注目的库没有重新绑定验证错误消息


谢谢

也许这种行为取决于jQuery验证插件的一个已知问题:为元素动态添加新的验证规则只需一次!进一步的尝试被拒绝,因为插件认为它们是定义已定义规则的重复尝试

这就是为什么添加新创建的内容时,
$.validator.unobtrusive.parse
不起作用的原因(例如,在向项目集合添加新行时)。有一个针对
$.validator.unobtrusive.parse
的补丁,您可以尝试将其应用于revalidate函数……但最好用另一种方式从头重写它。revalidate函数使用验证插件将所有验证错误放置在正确的位置,然后尝试重置验证插件的状态。但是,从表单中删除validator对象不足以取消所有已完成的作业,因为
表单.data(“unobtrusiveValidation”)中包含另一个对象,其中,表单是包含正在验证的表单的变量…此数据不会由revalidate函数重置…并且无法重置,因为重置这些数据将导致取消所有客户端验证规则

也许这个问题已经在验证插件的最后一个版本中解决了,所以尝试使用nuget更新到最后一个版本

如果这不能解决您的问题,我可以向您传递一个以完全不同的方式实现的类似函数(它模仿服务器在服务器端执行的操作,以显示服务器端错误)。它将包含在即将发布的Mvc控件工具包中。但是,如果你给我几天时间(我会很忙两天),我可以从那里提取它及其依赖项,这样你就可以使用它了。如果你有兴趣,请告诉我

低于我承诺的代码。它需要一个数组,其元素为:

{
    id:id of the element in error
    errors:array of strings errors associated to the element
}
它接受每个元素的多个错误,但只显示每个元素的第一个错误 id与名称不同,因为。[]另一个特殊字符替换为

您可以使用将服务器上的名称转换为id

htmlName.Replace('$', '_').Replace('.', '_').Replace('[', '_').Replace(']', '_');
或在javascript中的客户端上使用:

name.replace(/[\$\[\]\.]/g, '_');

function remoteErrors(jForm, errors) {
    //////////
    function inner_ServerErrors(elements) {
        var ToApply = function () {
            for (var i = 0; i < elements.length; i++) {
                var currElement = elements[i];
                var currDom = $('#' + currElement.id);
                if (currDom.length == 0) continue;
                var currForm = currDom.parents('form').first();
                if (currForm.length == 0) continue;

                if (!currDom.hasClass('input-validation-error'))
                    currDom.addClass('input-validation-error');
                var currDisplay = $(currForm).find("[data-valmsg-for='" + currElement.name + "']");
                if (currDisplay.length > 0) {
                    currDisplay.removeClass("field-validation-valid").addClass("field-validation-error");
                    replace = $.parseJSON(currDisplay.attr("data-valmsg-replace")) !== false;
                    if (replace) {
                        currDisplay.empty();
                        $(currElement.errors[0]).appendTo(currDisplay);
                    }
                }
            }
        };
        setTimeout(ToApply, 0);
    }
    /////////
    jForm.find('.input-validation-error').removeClass('input-validation-error');
    jForm.find('.field-validation-error').removeClass('field-validation-error').addClass('field-validation-valid');
    var container = jForm.find("[data-valmsg-summary=true]");
    list = container.find("ul");
    list.empty();
    if (errors.length > 0) {
        $.each(errors, function (i, ival) {
            $.each(ival.errors, function (j, jval) {
                $("<li />").html(jval).appendTo(list);
            });

        });
        container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
        inner_ServerErrors(errors);
        setTimeout(function () { jForm.find('span.input-validation-error[data-element-type]').removeClass('input-validation-error') }, 0);
    }
    else {
        container.addClass("validation-summary-valid").removeClass("validation-summary-errors");
    }
}
function clearErrors(jForm) {
    remoteErrors(jForm, []);
}
name.replace(/[\$\[\]\.]/g,'.'''.'替换);
函数remoteErrors(jForm,错误){
//////////
函数内部错误(元素){
var ToApply=函数(){
对于(var i=0;i0){
$.each(错误、函数(i、ival){
$.each(ival.errors,function(j,jval){
$(“
  • ”)html(jval).appendTo(list); }); }); container.addClass(“验证摘要错误”).removeClass(“验证摘要有效”); 内部错误(错误); setTimeout(函数(){jForm.find('span.input-validation-error[数据元素类型])).removeClass('input-validation-error'),0); } 否则{ container.addClass(“验证摘要有效”).removeClass(“验证摘要错误”); } } 函数clearErrors(jForm){ 远程错误(jForm,[]); }
  • name.replace(/[\$\[\]\.]/g, '_');
    
    function remoteErrors(jForm, errors) {
        //////////
        function inner_ServerErrors(elements) {
            var ToApply = function () {
                for (var i = 0; i < elements.length; i++) {
                    var currElement = elements[i];
                    var currDom = $('#' + currElement.id);
                    if (currDom.length == 0) continue;
                    var currForm = currDom.parents('form').first();
                    if (currForm.length == 0) continue;
    
                    if (!currDom.hasClass('input-validation-error'))
                        currDom.addClass('input-validation-error');
                    var currDisplay = $(currForm).find("[data-valmsg-for='" + currElement.name + "']");
                    if (currDisplay.length > 0) {
                        currDisplay.removeClass("field-validation-valid").addClass("field-validation-error");
                        replace = $.parseJSON(currDisplay.attr("data-valmsg-replace")) !== false;
                        if (replace) {
                            currDisplay.empty();
                            $(currElement.errors[0]).appendTo(currDisplay);
                        }
                    }
                }
            };
            setTimeout(ToApply, 0);
        }
        /////////
        jForm.find('.input-validation-error').removeClass('input-validation-error');
        jForm.find('.field-validation-error').removeClass('field-validation-error').addClass('field-validation-valid');
        var container = jForm.find("[data-valmsg-summary=true]");
        list = container.find("ul");
        list.empty();
        if (errors.length > 0) {
            $.each(errors, function (i, ival) {
                $.each(ival.errors, function (j, jval) {
                    $("<li />").html(jval).appendTo(list);
                });
    
            });
            container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
            inner_ServerErrors(errors);
            setTimeout(function () { jForm.find('span.input-validation-error[data-element-type]').removeClass('input-validation-error') }, 0);
        }
        else {
            container.addClass("validation-summary-valid").removeClass("validation-summary-errors");
        }
    }
    function clearErrors(jForm) {
        remoteErrors(jForm, []);
    }