我正在使用带有Data Annotations的ASP .NET MVC和jQuery validate插件 .
有没有办法标记某个字段(或某些数据注释)应该只在服务器端验证?
我有一个带有屏蔽插件的电话号码字段,正则表达式验证器在用户端变得疯狂 . 正则表达式只是一个故障安全(如果有人决定破解javascript验证),所以我不需要它在客户端运行 . 但我仍然喜欢运行客户端的其他验证 .
我不确定这个解决方案是否适用于MVC3 . 它肯定适用于MVC4:
您可以在呈现字段之前在Razor视图中禁用客户端验证,并在呈现字段后重新启用客户端验证 .
例:
<div class="editor-field"> @{ Html.EnableClientValidation(false); } @Html.TextBoxFor(m => m.BatchId, new { @class = "k-textbox" }) @{ Html.EnableClientValidation(true); } </div>
这里我们禁用BatchId字段的客户端验证 .
我也为此开发了一个小帮手:
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>
如果有人有更好的解决方案,请告诉我!
希望这有帮助 .
您可以通过添加 data-val='false' 属性来关闭单个字段的客户端不显眼验证:
data-val='false'
@Html.TextBoxFor(m => m.BatchId, new { data_val = "false" })
这将覆盖MVC由于任何 System.ComponentModel.DataAnnotations 属性而添加的 data-val='true' 属性 . HTML元素仍将使用其他验证属性(例如data-val-required)进行修饰,但它们不会产生任何影响 .
System.ComponentModel.DataAnnotations
data-val='true'
( data_val 在 data_val 上面.MVC自动将下划线转换为匿名类型属性中的连字符,因此 data_val 在呈现HTML时变为 data-val )
data_val
data-val
MVC5使用jquery.validate
http://jqueryvalidation.org/rules/
如果要删除MVC5客户端中的验证,则需要执行以下操作:
删除'myinput'上的所有验证
$("#myinput").rules("remove");
具体验证
$("#myinput").rules("remove", "min max" );
列出验证可以提供帮助
$("#myinput").rules();
Then 您将需要更正您的Code Behind以手动验证您的模型或不同,因为 ModelState.IsValid 将为false . 然后使用 ModelState.Clear() 和 TryValidateModel 可以很方便 .
ModelState.IsValid
ModelState.Clear()
TryValidateModel
Edit:
禁用该控件也会删除验证 .
$("#myinput").attr('disabled', disabledValue);
假设您使用默认的不显眼验证,您可以使用一些javascript来删除客户端的规则 . 看看Plugins/Validation/rules
为了在给定的场景中实现这一目标,我们需要进行两次调整 .
Client Side
要禁用客户端验证,我们需要强制禁用它 .
@Html.EditorFor(model => model.Password, new { htmlAttributes = new { @data_val = "false" , @class = "form-control"} })
注意@ data_val =“false” . 它将禁用此字段的验证 .
Server Side (In Action)
在post操作上验证模型时,ModelState.IsValid将始终返回false,因为未提供密码 . 在这里,我们必须为模型提供当前密码并重新验证模型 .
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上的更新结果 .
我遇到了data_val = "true"的问题 . 我有一系列单选按钮绑定到我的模型中的单个属性 . 数据验证仅在我将data_val = "true"应用于 first @ Html.RadioButtonFor调用时才有效 .
在调试时,我发现你也可以使用data_rule _ ??来禁用或改变客户端的各个规则 . 规则可以在jquery验证documentation中找到 .
例如;
@Html.RadioButtonFor(m => m.Answer, "Yes", new { data_rule_Required = "false" }); @Html.TextBoxFor(m => m.Answer, new { data_rule_minlength = "10" }
$("#Email").rules("remove", { "required", "minlength", "email" } });
7 回答
我不确定这个解决方案是否适用于MVC3 . 它肯定适用于MVC4:
您可以在呈现字段之前在Razor视图中禁用客户端验证,并在呈现字段后重新启用客户端验证 .
例:
这里我们禁用BatchId字段的客户端验证 .
我也为此开发了一个小帮手:
您将按如下方式使用它:
如果有人有更好的解决方案,请告诉我!
希望这有帮助 .
您可以通过添加
data-val='false'
属性来关闭单个字段的客户端不显眼验证:这将覆盖MVC由于任何
System.ComponentModel.DataAnnotations
属性而添加的data-val='true'
属性 . HTML元素仍将使用其他验证属性(例如data-val-required)进行修饰,但它们不会产生任何影响 .(
data_val
在data_val
上面.MVC自动将下划线转换为匿名类型属性中的连字符,因此data_val
在呈现HTML时变为data-val
)MVC5使用jquery.validate
http://jqueryvalidation.org/rules/
如果要删除MVC5客户端中的验证,则需要执行以下操作:
删除'myinput'上的所有验证
具体验证
列出验证可以提供帮助
Then 您将需要更正您的Code Behind以手动验证您的模型或不同,因为
ModelState.IsValid
将为false . 然后使用ModelState.Clear()
和TryValidateModel
可以很方便 .Edit:
禁用该控件也会删除验证 .
假设您使用默认的不显眼验证,您可以使用一些javascript来删除客户端的规则 . 看看Plugins/Validation/rules
为了在给定的场景中实现这一目标,我们需要进行两次调整 .
Client Side
要禁用客户端验证,我们需要强制禁用它 .
注意@ data_val =“false” . 它将禁用此字段的验证 .
Server Side (In Action)
在post操作上验证模型时,ModelState.IsValid将始终返回false,因为未提供密码 . 在这里,我们必须为模型提供当前密码并重新验证模型 .
让我解释一下,首先我们检索保存在数据库中的当前信息,如果没有提供密码,我们稍后将其用于分配给当前模型 . 最后两行实际上重置了ModelState以返回ModelState.IsValid上的更新结果 .
我遇到了data_val = "true"的问题 . 我有一系列单选按钮绑定到我的模型中的单个属性 . 数据验证仅在我将data_val = "true"应用于 first @ Html.RadioButtonFor调用时才有效 .
在调试时,我发现你也可以使用data_rule _ ??来禁用或改变客户端的各个规则 . 规则可以在jquery验证documentation中找到 .
例如;
如果要删除MVC5客户端中的验证,则需要执行以下操作: