クライアントの検証とともに、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");
/* }); */