3

MVC4 を使用して、IClientValidatable以下に示すようにインターフェイスを実装するカスタム検証属性を作成しました。

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        ModelClientValidationRule rule = new ModelClientValidationRule();
        rule.ErrorMessage = ErrorMessages.ClientFieldInputValidation;
        rule.ValidationType = "regularexpression";
        rule.ValidationParameters.Add("pattern", _regEx);
        yield return rule;
    }

'regularexpression'以下に示すように、クライアントスクリプトも実装しました。

(function($) {
    $.validator.addMethod('regularexpression', function(value, element, params) {
        var regEx = RegExp(params['pattern']);
        return regEx.test($(element).val());
    });

    $.validator.unobtrusive.adapters.addBool('regularexpression');

})(jQuery)

私が抱えている問題は、JavaScript: の 3 行目で正規表現が取得されないことですvar regEx = RegExp(params['pattern']);。したがって、クライアント側の検証が正しく機能していません。サーバー側の検証は正常に機能しており、[送信] をクリックすると正しいフィードバックが返されます。

注: の代わりに正規表現をハードコーディングしてみましたが、params['pattern']正常に動作します。

JavaScriptに関する私の知識はあなたが強いと呼ぶものではないので、誰かがこれを手伝ってくれませんか.

4

2 に答える 2

11

クライアントの検証とともに、1 つのデータ オブジェクトに複数の正規表現の検証を適用する場合、"regex" と同じ ValidationType 名を使用することはできません。独自のカスタムの一意の ValidationType を何らかの方法で使用する必要があります。JavaScript 部分の問題は、正規表現バリデータ メソッドに間違った注入メソッドを使用していることです。

$.validator.unobtrusive.adapters.addBool('regularexpression');

サーバー側のパターン値をクライアント側のメソッドに渡すには、上記の代わりに以下のメソッドを使用する必要があります

$.validator.unobtrusive.adapters.addSingleVal("regularexpression", "pattern");

これが私のサンプルソースです...

サーバー側で、各カスタム検証属性を作成します。

public class OneDigitAttribute : RegularExpressionAttribute, IClientValidatable
{
    public OneDigitAttribute()
        : base(@"^.*(?=.*\d).+$")
    {
        ErrorMessage = "Required at least one numeric digit";
    }

    // for supporting a client-side validation through jquery.validation.unobtrusive
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRegexRule(this.ErrorMessage, this.Pattern)
        {
            ValidationType = "onedigit"
        };
    }
}

public class OneAlphaAttribute : RegularExpressionAttribute, IClientValidatable
{
    public OneAlphaAttribute()
        : base(@"^.*(?=.*[a-zA-Z]).+$")
    {
        ErrorMessage = "Required at least one alphabet character";
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRegexRule(this.ErrorMessage, this.Pattern)
        {
            ValidationType = "onealpha"
        };
    }
}

public class OneSpecialCharacterAttribute : RegularExpressionAttribute, IClientValidatable
{
    public OneSpecialCharacterAttribute()
        : base(@"^.*(?=.*[^a-zA-Z0-9]).+$")
    {
        ErrorMessage = "Required at least one non alphabet numeric(special) character";
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRegexRule(this.ErrorMessage, this.Pattern)
        {
            ValidationType = "onespecial"
        };
    }
}

それらを同じプロパティに適用します

[OneDigit]
[OneAlpha]
[OneSpecialCharacter]
[DataType(DataType.Password)]
public string NewPassword { get; set; } 
...

次に、以下のようにクライアント側にそれぞれの一意の検証方法を追加します

$.validator.addMethod("onedigit", function (value, element, regexp) {
    var re = new RegExp(regexp); return re.test(value);
});

$.validator.addMethod("onealpha", function (value, element, regexp) {
    var re = new RegExp(regexp); return re.test(value);
});
$.validator.addMethod("onespecial", function (value, element, regexp) {
    var re = new RegExp(regexp); return re.test(value);
});
jQuery.validator.unobtrusive.adapters.addSingleVal("onedigit", "pattern");
jQuery.validator.unobtrusive.adapters.addSingleVal('onealpha', "pattern");
jQuery.validator.unobtrusive.adapters.addSingleVal('onespecial', "pattern");

また、それらすべてを DOM 対応関数内に配置しないようにしてください。例えば:

/* $(function() { */
$.validator.addMethod("regularexpression", function (value, element, regexp) {
    var re = new RegExp(regexp); return re.test(value);
});
$.validator.unobtrusive.adapters.addSingleVal("regularexpression", "pattern");
/* }); */
于 2013-10-09T21:09:08.957 に答える