1. ホーム
  2. c#

ASP .NET MVCでフィールド単位でクライアントサイドの検証を無効にする

2023-09-14 22:35:14

質問

ASP .NET MVC 3で、Data Annotationsと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>

もし、もっと良い解決策をお持ちの方がいらっしゃいましたら、ぜひ教えてください。

これが助けになることを願っています。