Rya*_*yan 69 c# validation asp.net-mvc jquery jquery-validate
我正在使用带有Data Annotations的ASP .NET MVC和jQuery validate插件.
有没有办法标记某个字段(或某些数据注释)应该只在服务器端验证?
我有一个带有屏蔽插件的电话号码字段,正则表达式验证器在用户端变得疯狂.正则表达式只是一个故障安全(如果有人决定破解javascript验证),所以我不需要它在客户端运行.但我仍然喜欢运行客户端的其他验证.
Lor*_*ato 100
我不确定这个解决方案是否适用于MVC3.它肯定适用于MVC4:
您可以在呈现字段之前在Razor视图中禁用客户端验证,并在呈现字段后重新启用客户端验证.
例:
<div class="editor-field">
@{ Html.EnableClientValidation(false); }
@Html.TextBoxFor(m => m.BatchId, new { @class = "k-textbox" })
@{ Html.EnableClientValidation(true); }
</div>
Run Code Online (Sandbox Code Playgroud)
这里我们禁用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;
}
}
Run Code Online (Sandbox Code Playgroud)
您将按如下方式使用它:
<div class="editor-field">
@using (Html.BeginDisableClientSideValidation()) {
@Html.TextBoxFor(m => m.BatchId, new { @class = "k-textbox" })
}
</div>
Run Code Online (Sandbox Code Playgroud)
如果有人有更好的解决方案,请告诉我!
希望这有帮助.
Ros*_*Nab 84
您可以通过添加data-val='false'属性来关闭单个字段的客户端不显眼验证:
@Html.TextBoxFor(m => m.BatchId, new { data_val = "false" })
Run Code Online (Sandbox Code Playgroud)
这将覆盖data-val='true'MVC由于任何System.ComponentModel.DataAnnotations属性而添加的属性.HTML元素仍将使用其他验证属性(例如data-val-required)进行修饰,但它们不会产生任何影响.
(注意下划线在data_val上方.MVC自动转换下划线来匿名类型属性连字符,所以data_val成为data-val呈现HTML时)
Gui*_*ish 19
MVC5使用jquery.validate
http://jqueryvalidation.org/rules/
如果要删除MVC5客户端中的验证,则需要执行以下操作:
删除'myinput'上的所有验证
$("#myinput").rules("remove");
Run Code Online (Sandbox Code Playgroud)
具体验证
$("#myinput").rules("remove", "min max" );
Run Code Online (Sandbox Code Playgroud)
列出验证可以提供帮助
$("#myinput").rules();
Run Code Online (Sandbox Code Playgroud)
然后,您需要更正您的Code Behind以手动验证您的模型或不同,因为ModelState.IsValid它将是错误的.使用ModelState.Clear(),TryValidateModel然后可以很方便.
编辑:
禁用该控件也会删除验证.
$("#myinput").attr('disabled', disabledValue);
Run Code Online (Sandbox Code Playgroud)
为了在给定的场景中实现这个目标,我们需要做两个调整。
客户端
要禁用客户端验证,我们需要强制禁用它。
@Html.EditorFor(model => model.Password, new { htmlAttributes = new { @data_val = "false" , @class = "form-control"} })
Run Code Online (Sandbox Code Playgroud)
注意@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);
Run Code Online (Sandbox Code Playgroud)
让我解释一下,首先我们检索保存在数据库中的当前信息,如果未提供密码,我们稍后将使用该信息分配给当前模型。最后两行实际上重置了 ModelState 以返回 ModelState.IsValid 上的更新结果。
| 归档时间: |
|
| 查看次数: |
73350 次 |
| 最近记录: |