首页 文章

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

提问于
浏览
66

我正在使用带有Data Annotations的ASP .NET MVC和jQuery validate插件 .

有没有办法标记某个字段(或某些数据注释)应该只在服务器端验证?

我有一个带有屏蔽插件的电话号码字段,正则表达式验证器在用户端变得疯狂 . 正则表达式只是一个故障安全(如果有人决定破解javascript验证),所以我不需要它在客户端运行 . 但我仍然喜欢运行客户端的其他验证 .

7 回答

  • 18

    我不确定这个解决方案是否适用于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>
    

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

    希望这有帮助 .

  • 97

    您可以通过添加 data-val='false' 属性来关闭单个字段的客户端不显眼验证:

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

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

    data_valdata_val 上面.MVC自动将下划线转换为匿名类型属性中的连字符,因此 data_val 在呈现HTML时变为 data-val

  • 1

    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 可以很方便 .

    Edit:

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

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

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

  • 4

    为了在给定的场景中实现这一目标,我们需要进行两次调整 .

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

  • 7

    我遇到了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" }
    
  • 0

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

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

相关问题