ASP.NET .NET MVC禁用每个字段级别的客户端validation

我正在使用ASP .NET MVC 3与数据注释和jQueryvalidation插件。

有没有办法标记一个特定的字段(或某些数据注释)只应该validation服务器端?

我有一个电话号码字段,上面有一个掩码插件,正则expression式validation器在用户端疯狂。 正则expression式只是一个自动保险箱(如果有人决定破解javascriptvalidation),所以我不需要它在客户端运行。 但我仍然喜欢其他validation运行客户端。

我不确定这个解决scheme是否适用于MVC3。 它肯定适用于MVC4:

您可以简单地在渲染字段之前禁用Razor视图中的客户端validation,并在字段渲染后重新启用客户端validation。

例:

<div class="editor-field"> @{ Html.EnableClientValidation(false); } @Html.TextBoxFor(m => m.BatchId, new { @class = "k-textbox" }) @{ Html.EnableClientValidation(true); } </div> 

这里我们禁用BatchId字段的客户端validation。

我也为此开发了一个小帮手:

 public static class YnnovaHtmlHelper { public static ClientSideValidationDisabler BeginDisableClientSideValidation(this HtmlHelper html) { return new ClientSideValidationDisabler(html); } } public class ClientSideValidationDisabler : IDisposable { private HtmlHelper _html; public ClientSideValidationDisabler(HtmlHelper html) { _html = html; _html.EnableClientValidation(false); } public void Dispose() { _html.EnableClientValidation(true); _html = null; } } 

您将如下使用它:

 <div class="editor-field"> @using (Html.BeginDisableClientSideValidation()) { @Html.TextBoxFor(m => m.BatchId, new { @class = "k-textbox" }) } </div> 

如果有人有更好的解决scheme,请让我知道!

希望这个帮助。

您可以通过添加data-val='false'属性closures客户端对单个字段的不显眼validation:

 @Html.TextBoxFor(m => m.BatchId, new { data_val = "false" }) 

这将覆盖MVC由于任何System.ComponentModel.DataAnnotations属性而增加的data-val='true'属性。 HTML元素仍将用其他validation属性(例如data-val-required)进行修饰,但不会产生任何效果。

注意上面的data_val 的下划线 ,MVC会自动将下划线转换为匿名types属性中的连字符,因此data_val在呈现HTML时变为data-val

MVC5使用jquery.validate

http://jqueryvalidation.org/rules/

如果你想在MVC5客户端删除validation,你需要执行以下操作:

删除“myinput”上的所有validation

 $("#myinput").rules("remove"); 

具体的validation

 $("#myinput").rules("remove", "min max" ); 

列出validation可以帮助

 $("#myinput").rules(); 

然后,您将需要更正您的代码后面手动validation您的模型或不同,因为ModelState.IsValid将是错误的。 然后使用ModelState.Clear()TryValidateModel可以很方便。

编辑:

禁用该控件也会删除validation。

 $("#myinput").attr('disabled', disabledValue); 

假设你使用默认的不显眼的validation,你可以使用一些JavaScript来删除客户端的规则。 看看插件/validation/规则

为了达到这个目标,我们需要做两个调整。

客户端

要禁用客户端validation,我们需要强制禁用它。

 @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @data_val = "false" , @class = "form-control"} }) 

注意@ data_val =“false”。 它将禁用此字段的validation。

服务器端(实际操作)

当模型在post动作上被validation时,ModelState.IsValid将总是返回false,因为没有提供密码。 在这里,我们必须提供当前密码给模型,并重新validation模型。

 var userObj = db.Users_Info.Where(a => a.Id == users_Info.Id).FirstOrDefault(); if (String.IsNullOrEmpty(users_Info.Password)) { users_Info.Password = userObj.Password; } ModelState.Clear(); TryValidateModel(users_Info); 

让我解释一下,首先我们检索保存在数据库中的当前信息,如果密码没有提供的话,我们以后使用这个信息分配给当前模型。 最后两行实际上重置了ModelState以在ModelState.IsValid上返回更新的结果。