删除 mvc 中的客户端验证错误

Posted

技术标签:

【中文标题】删除 mvc 中的客户端验证错误【英文标题】:removing client side validation errors in mvc 【发布时间】:2018-09-01 03:06:23 【问题描述】:

我有一个 mvc 表单,用户可以在其中添加动态元素。我正在对 MVC 使用不显眼的验证。 我还有两个按钮,一个保存为草稿,另一个提交。提交按钮正确触发验证,包括添加的动态元素。

但是,如果单击另存为草稿,我很难在客户端清除验证属性 data-val-*。

无论我做什么,我都无法触发表单提交来调用我的操作方法。显然只有这样我才能处理禁用服务器端验证。

我尝试了以下方法

                 $("#myform").submit(function () 
                    ---
                    //some code to check which submit button was clicked
                    //if save as draft was clicked, proceed below
                    ---
                    var settings = $("#myform").validate().settings;
                    for (var ruleIndex in settings.rules) 
                        delete settings.rules[ruleIndex];

                    $('#myform').clearErrors();

                    //$("#myform").removeData("validator")    
                    //    .removeData("unobtrusiveValidation");
                    $("select").removeAttr("data-val-required");
                    $("select").removeAttr("data-val-number");

                    $("input").removeAttr("data-val-required");


                    if ($("#myform").valid()) 
                        alert("valid");  //I can reach here indicating that the form is valid at this point.But still my action  method is not called.
                    
                

             $.fn.clearErrors = function () 

                $(this).each(function () 

                    $(this).find(".field-validation-error").empty();
                    $(this).find(".input-validation-error").removeClass("input-validation-error");
                    $(this).trigger('reset.unobtrusiveValidation');
                );
            ;

【问题讨论】:

建议您阅读 this answer,包括 cmets 和聊天中的人,以了解为什么您尝试做的事情是个坏主意。 嗨斯蒂芬,我明白你为什么说这是一个坏主意。在我的情况下,我有一个父子模型,并且我正在动态添加子节点,并且可能存在子节点。看来我必须在所有子元素上都有 IsDraft 属性才能使验证器正常工作。 (所以我基​​本上在提交时将所有子元素的 is Draft 变量设置为 YES)我绝对可以沿着这条路走,但很想知道为什么清除验证不起作用。谢谢! 至少,您需要从所有元素中删除所有 data-val="true" 属性,然后删除验证器并重新解析它 - $("#myform").data('validator', null); $.validator.unobtrusive.parse($("#myform")); 【参考方案1】:

尝试在“另存为草稿”按钮上添加 formnovalidate 属性,如中所述 Documentation for jqueryvalidation.

例子:

<input type="submit" formnovalidate name="saveAsDraft" value="Cancel">

如果您使用的是旧版本,您可能必须使用 class="cancel" 属性而不是 formnovalidate 属性。 示例:

<input type="submit" class="cancel" name="saveAsDraft" value="Cancel">

【讨论】:

此外,一旦您使用 SaveAsDraft 按钮发布帖子,您可以在返回视图之前清除操作方法中的任何模型验证错误,否则您最终会刷新视图并显示验证错误。发生这种情况是因为如果 ModelState 中存在任何验证错误并且 Razor 尝试渲染视图,它将从 ModelState 将这些验证错误添加到视图中。 是的,我想我所缺少的只是输入提交按钮上的 class="cancel"。感谢您指出这一点。

以上是关于删除 mvc 中的客户端验证错误的主要内容,如果未能解决你的问题,请参考以下文章

禁用/删除 Kendo mvc 验证器

MVC 身份验证超时/会话 cookie 删除后的 Ajax 请求

自定义验证属性中的客户端验证 - asp.net mvc 4

ASP.NET MVC 项目中的客户端验证未验证规则

通过与客户端 (MVC) 一起使用 Web API 中的操作来验证电子邮件是不是存在于数据库中并进行远程验证?

如何对asp.net mvc 4中的select2字段进行强制字段验证