我正在使用带有数据注释的ASP .NET MVC 3和jQuery validate插件。
有没有办法标记某个字段(或某些数据注释)只应在服务器端验证?
我有一个带有屏蔽插件的电话号码字段,正则表达式验证器在用户端变得疯狂。正则表达式只是一个故障安全(如果有人决定破解javascript验证),所以我不需要它在客户端运行。但我仍然喜欢运行客户端的其他验证。
答案 0 :(得分:98)
我不确定这个解决方案是否适用于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>
如果有人有更好的解决方案,请告诉我们!
希望得到这个帮助。
答案 1 :(得分:82)
您可以通过添加data-val='false'
属性来关闭单个字段的客户端不显眼验证:
@Html.TextBoxFor(m => m.BatchId, new { data_val = "false" })
这将覆盖MVC由于任何data-val='true'
属性而添加的System.ComponentModel.DataAnnotations
属性。 HTML元素仍将使用其他验证属性(例如data-val-required)进行修饰,但它们不会产生任何影响。
(请注意上面data_val
中的下划线。MVC会自动将下划线转换为匿名类型属性中的连字符,因此在呈现HTML时data_val
变为data-val
答案 2 :(得分:18)
MVC5使用jquery.validate
http://jqueryvalidation.org/rules/
如果要删除MVC5客户端中的验证,则需要执行以下操作:
删除&#39; myinput&#39;
上的所有验证$("#myinput").rules("remove");
特定验证
$("#myinput").rules("remove", "min max" );
列出验证可以提供帮助
$("#myinput").rules();
然后您需要更正您的Code Behind以手动验证您的模型或不同,因为ModelState.IsValid
将为false。使用ModelState.Clear()
和TryValidateModel
可以很方便。
修改强>
禁用该控件也会删除验证。
$("#myinput").attr('disabled', disabledValue);
答案 3 :(得分:7)
假设您使用默认的不显眼验证,您可以使用一些javascript来删除客户端的规则。看看Plugins/Validation/rules
答案 4 :(得分:4)
为了在给定方案中实现这一目标,我们需要进行两次调整。
客户端
要禁用客户端验证,我们需要强制禁用它。
@Html.EditorFor(model => model.Password, new { htmlAttributes = new { @data_val = "false" , @class = "form-control"} })
注意@ data_val =“false”。它将禁用此字段的验证。
服务器端(在行动中)
在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上的更新结果。
答案 5 :(得分:1)
我遇到了data_val =“ true”的麻烦。我的模型中有一系列单选按钮绑定到单个属性。仅当我将data_val =“ true”应用于第一个 @ 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" }
答案 6 :(得分:0)
如果要删除MVC5客户端中的验证,则需要执行以下操作:
$("#Email").rules("remove", {
"required",
"minlength",
"email"
}
});