【问题标题】:ASP .NET MVC Disable Client Side Validation at Per-Field LevelASP .NET MVC 在每字段级别禁用客户端验证
【发布时间】:2011-04-12 04:29:20
【问题描述】:

我正在使用带有数据注释和 jQuery 验证插件的 ASP .NET MVC 3。

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

我有一个带有屏蔽插件的电话号码字段,并且正则表达式验证器在用户端发疯了。正则表达式只是一个故障安全(以防有人决定破解 javascript 验证),所以我不需要它在客户端运行。但我仍然希望其他验证运行客户端。

【问题讨论】:

    标签: c# jquery asp.net-mvc validation jquery-validate


    【解决方案1】:

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

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

    希望对您有所帮助。

    【讨论】:

    • 很好,除了它打开验证,即使它一开始就关闭。
    • 当然可以增强!
    • 我让它在稍微复杂一点的情况下工作,如果字段有多个验证器,则通过找出该特定验证提供程序添加的数据属性并将它们设置为空字符串来删除单个验证.到目前为止它正在工作。谢谢你的建议。
    • 这是一个非常好的解决方案,因为页面在源中加载的文本较少。由于不必要的验证文本,它显着缩短了加载时间。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 除非我加下划线,否则 IIS 会给我一个例外。编译器错误消息:CS0746:无效的匿名类型成员声明符。必须使用成员分配、简单名称或成员访问来声明匿名类型成员。
    • 这就像一个魅力,是我发现的这个问题的最干净的解决方案。
    • 这很好用,是最干净的解决方案。谢谢!
    • @data_val 不会在 MVC 5 中呈现“data-val”。
    • 它的工作原理是这样的:@Html.EditorFor(model=>model.Phone2, new { htmlAttributes = new { data_val_number = "Must be numeric" } })
    【解决方案3】:

    MVC5 使用 jquery.validate

    http://jqueryvalidation.org/rules/

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

    删除“myinput”上的所有验证

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

    具体验证

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

    列出验证会有所帮助

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

    然后您将需要更正您的代码隐藏以手动验证您的模型或以其他方式验证,因为ModelState.IsValid 将是错误的。使用ModelState.Clear()TryValidateModel 会很方便。

    编辑:

    禁用控件也会删除验证。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        客户端

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-19
              • 2011-11-15
              • 1970-01-01
              • 2015-09-05
              • 1970-01-01
              相关资源
              最近更新 更多