ASP .NET MVC Disable Client Side Validation at Per-Field Level

I'm using ASP .NET MVC 3 with Data Annotations and the jQuery validate plugin.

Is there a way to mark that a certain field (or certain data annotation) should only be validated server-side?

I have a phone number field with a masking plugin on it, and the regular expression validator goes crazy on the user's end. The regex is only a fail-safe (in case someone decides to hack the javascript validation), so I don't need it to run on the client side. But I'd still like the other validation to run client side.

87228 次浏览

假设您使用默认的不引人注目的验证,您可以使用一些 javascript 来删除客户端的规则。看看 插件/验证/规则

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

您只需在呈现字段之前禁用 Razor 视图中的客户端验证,并在呈现字段之后重新启用客户端验证。

Example:

<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>

如果有人有更好的解决方案,请告诉我!

希望这个能帮上忙。

You can switch off client-side unobtrusive validation for a single field by adding a data-val='false' attribute:

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

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

(以上 data_val中的 注意下划线。MVC 在匿名类型属性中自动将下划线转换为连字符,因此在呈现 HTML 时 data_val变成 data-val)

MVC5使用 jquery.valid

Http://jqueryvalidation.org/rules/

如果您想删除 MVC5客户端中的验证,您需要执行以下操作:

Remove all validations on 'myinput'

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

具体验证

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

列出验证可能会有所帮助

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

然后 您将需要更正您的 Code Behind 来手动验证您的模型,或者以不同的方式验证,因为 ModelState.IsValid将为 false。使用 ModelState.Clear()TryValidateModel可以很方便。

编辑:

禁用该控件也会删除验证。

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

为了在给定的场景中实现这个目标,我们需要做两个调整。

客户端

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

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

Notice the @data_val= “false”. It will disable the validation on this field.

服务器端(在运行中)

当在 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 上更新的结果。

If you want to remove validations in MVC5 client-Side you need to do the following:

$("#Email").rules("remove", {
"required",
"minlength",
"email"
}
});

我在使用 data _ val = “ true”时遇到了麻烦。我有一系列的单选按钮绑定到我的模型中的一个属性上。只有当我将 data _ val = “ true”应用到 first@Html 时,数据验证才起作用。呼叫。

在调试过程中,我发现您还可以通过使用 data _ rule _? ? 在客户端禁用或更改单独的规则?.规则可以在 jquery 验证 文件中找到。

例如:

@Html.RadioButtonFor(m => m.Answer, "Yes", new { data_rule_Required = "false" });
@Html.TextBoxFor(m => m.Answer, new { data_rule_minlength = "10" }