web-dev-qa-db-ja.com

ASP .NET MVCはフィールドごとのレベルでクライアント側の検証を無効にします

ASP .NET MVC 3 with Data AnnotationsおよびjQuery validate pluginを使用しています。

特定のフィールド(または特定のデータ注釈)をサーバー側でのみ検証する必要があることをマークする方法はありますか?

電話番号フィールドにマスキングプラグインがあり、ユーザーの側で正規表現バリデーターが狂っています。正規表現はフェイルセーフのみであるため(誰かがjavascript検証をハッキングすることにした場合)、クライアント側で実行する必要はありません。しかし、私はまだクライアント側を実行する他の検証が欲しいです。

69
Ryan

このソリューションが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>

誰かがより良い解決策を持っているなら、私に知らせてください!

この助けを願っています。

99
Lorenzo Melato

data-val='false'属性を追加することにより、単一フィールドのクライアント側の控えめな検証をオフに切り替えることができます。

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

これは、data-val='true'属性によりMVCが追加するSystem.ComponentModel.DataAnnotations属性をオーバーライドします。 HTML要素は他の検証属性(例:data-val-required)で装飾されますが、効果はありません。

アンダースコアに注意してください in data_val上記。MVCは匿名型プロパティでアンダースコアを自動的にハイフンに変換するため、HTMLのレンダリング時にdata_valdata-valになります)

84
Ross McNab

MVC5はjquery.validateを使用します

http://jqueryvalidation.org/rules/

MVC5クライアント側で検証を削除する場合は、次を実行する必要があります。

「myinput」のすべての検証を削除します

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

特定の検証

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

検証のリストが役立つ場合があります

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

Thenコードビハインドを修正して、モデルを手動で検証するか、別の方法で検証する必要があります。これはModelState.IsValidがfalseになるためです。 ModelState.Clear()TryValidateModelを使用すると便利です。

編集:

コントロールを無効にすると、検証も削除されます。

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

デフォルトの控えめな検証を使用すると仮定すると、JavaScriptを使用してクライアント側のルールを削除できます。 Plugins/Validation/rules をご覧ください

7
archil

特定のシナリオでこの目標を達成するには、2つの調整を行う必要があります。

クライアント側

クライアント側の検証を無効にするには、強制的に無効にする必要があります。

@Html.EditorFor(model => model.Password, new { htmlAttributes = new {  @data_val = "false" , @class = "form-control"} })

@ data_val =“ false”に注意してください。このフィールドの検証は無効になります。

サーバー側(アクション中)

投稿アクションでモデルが検証されると、パスワードが提供されないため、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);

説明します。まず、データベースに保存されている現在の情報を取得します。この情報は、後でパスワードが提供されない場合に現在のモデルに割り当てるために使用します。最後の2行は、ModelStateを実際にリセットして、ModelState.IsValidで更新された結果を返します。

4
The Angry Coder

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" }
1
Peter Henry

MVC5クライアント側で検証を削除する場合は、次を実行する必要があります。

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