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上返回更新的结果。