一尘不染

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

c#

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

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

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


阅读 388

收藏
2020-05-19

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

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

希望能有所帮助。

2020-05-19