web-dev-qa-db-ja.com

パラメーターを使用したASP.NET MVC 3クライアント側検証

この投稿の続き カスタム属性のクライアント側検証を実行

私はこれを行う方法を頭に入れて、クライアント側スクリプトに追加のパラメータを渡そうとしています

これまでのところ、MVC 3でカスタム検証を実装するには次のことが必要です。

カスタム検証属性を作成する

ValidationAttributeに基づき、IClientValidatableを実装します。また、ValidationAttributeとIClientValidatableの両方の機能を実装しているように見えるModelValidatorに由来するいくつかの例を確認しました。だから、これは違いが何であるか、ModelValidatorがMVC 2で使用されていたが現在は非推奨であるかどうかに関する混乱の最初のポイントです?

ModelClientValidationRuleのインスタンスをGetClientValidationRules()から返して、エラーメッセージ、ValidationType(クライアント側の検証を実行するJavascript関数の名前であると理解している)、属性を追加するカスタムパラメータなどの詳細を指定する必要がありますJavascript検証に渡す必要がある場合があります。

次に、ランタイム(その一部が不明)がModelClientValidationRuleを使用して、次のようにタグ要素にhtml属性を生成すると仮定します。

data-val="true"  (to indicate that the element requires validation)
data-val-[ValidationType]=[ErrorMessage]
data-val-[ValidationType].[ValidationParameters(n).Key]=[ValidationParameters(n).Value]

クライアント側の検証ロジックを実装する

Javascript関数を作成し、jQuery.validators.addmethod()を使用してjQuery.validatorsに追加する必要があります。これにより、JQueryを実行する必要があるときに認識できるようになります。何かのようなもの:

jQuery.validator.addMethod(
    'greaterThan', 
    function (value, element, params) {
        /.../
       return /* true or false   */ ; 
    },
    ''
); 

ここでの私の質問は、署名「関数(値、要素、パラメーター)」が検証を処理するメソッドの標準であり、フォームが送信される前などの適切なタイミングでjQuery機能によって呼び出されることを前提としています要素は、便を失うか、keyUpイベントで発生します。私はあなたがこれをどのように制御できるかを理解していません。つまり、どのイベントがカスタム検証に適しているかを選択します。

控えめなアダプターを実装する

これは控えめな属性を次のように変換します。私はあまり明確ではありませんが、それをjQueryルールと仮定しますが、それらがどのように機能するのかは明確ではありません。何かのようなもの

jQuery.validator.unobtrusive.adapters.add(
    'futuredate', 
    { },
    function (options) {
        options.rules['greaterThan'] = true;
        options.messages['greaterThan'] = options.message;
    }
); 

ここでの私の質問は、「機能(オプション)」についてです。これは、 'function(value、element、params)'の前に呼び出される関数であり、jQuery.Validationが理解できるデータ構造に控えめなタグを抽出する役割を果たします。コード例から、optionsはタグの属性値(options.messageなど)とマップする必要があるjQuery関連プロパティ(options.messages ['ClientSideValidationFunctionName']などの両方を含むオブジェクトであるように思えます。 。その場合、カスタムパラメータはどのように取得およびマッピングされますか。

追加の混乱を追加していないことを望みます。

54
ricardo

ValidationParameters プロパティを使用して、カスタムパラメータをルールに追加できます。

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    var rule = new ModelClientValidationRule
    {
        ErrorMessage = this.ErrorMessage,
        ValidationType = "futuredate",
    };
    rule.ValidationParameters.Add("param1", "value1");
    rule.ValidationParameters.Add("param2", "value2");
    yield return rule;
}

アダプタで使用できます:

jQuery.validator.unobtrusive.adapters.add(
    'futuredate', 
    [ 'param1', 'param2' ],
    function (options) {
        var param1 = options.params.param1; // shall equal 'value1'
        var param2 = options.params.param2; // shall equal 'value2'
        // TODO: use those custom parameters to define the client rules
    }
);

更新:

コメントセクションで要求されているように、これらのパラメーターをカスタムバリデータールール関数に渡す方法は次のとおりです。

jQuery.validator.unobtrusive.adapters.add(
    'futuredate', 
    [ 'param1', 'param2' ],
    function (options) {
        // simply pass the options.params here
        options.rules['greaterThan'] = options.params;
        options.messages['greaterThan'] = options.message;
    }
);

jQuery.validator.addMethod('greaterThan', function (value, element, params) {
    // params here will equal { param1: 'value1', param2: 'value2' }
    return ...
}, '');
66
Darin Dimitrov