ASP .NET MVC在每个字段级别禁用客户端验证

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)

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

希望这有帮助.

  • 当然它可以增强! (3认同)
  • 很好,除非它开始验证,即使它已经开始. (2认同)

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

  • 这很好用,是最干净的解决方案.谢谢! (3认同)
  • @data_val不会在MVC 5中呈现"data-val". (3认同)
  • 这就像一个魅力,是我发现的这个问题最干净的解决方案. (2认同)

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)


arc*_*hil 7

假设您使用默认的不显眼验证,您可以使用一些javascript来删除客户端的规则.看看插件/验证/规则


Ang*_*der 6

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

客户端

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

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