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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP .NET MVC在每个字段级别禁用客户端验证相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

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

希望这有帮助。

另一答案

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

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

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

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

另一答案

MVC5使用jquery.validate

http://jqueryvalidation.org/rules/

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

删除'myinput'上的所有验证

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

具体验证

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

列出验证可以提供帮助

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

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

编辑:

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

$("#myinput").attr('disabled', disabledValue);
另一答案

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

另一答案

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

客户端

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

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

另一答案

我遇到了data_val =“true”的问题。我有一系列单选按钮绑定到我的模型中的单个属性。数据验证仅在我将data_val =“true”应用于第一个@ 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" }
另一答案

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

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

以上是关于ASP .NET MVC在每个字段级别禁用客户端验证的主要内容,如果未能解决你的问题,请参考以下文章

编辑网格时,如何按行禁用特定字段? Kendo UI ASP.Net MVC 包装器

在 Asp.Net MVC 中禁用模型验证

客户端验证在带有 Bootstrap 的 ASP.NET MVC5 中不起作用

使用多个字段过滤/搜索 - ASP.NET MVC

如何使用jQuery unobtrusive和Asp.Net Mvc验证动态生成的单选按钮组?

asp.net mvc - 完全脱离数据库中的自定义字段构建视图