C# 客户端自定义不引人注目的验证不起作用

C# 客户端自定义不引人注目的验证不起作用,c#,jquery,asp.net-mvc,unobtrusive-validation,C#,Jquery,Asp.net Mvc,Unobtrusive Validation,使用MVC4,我创建了一个自定义验证属性,该属性实现了IClientValidable接口,如下所示: public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { ModelClientValidationRule rule = new ModelClientValidati

使用MVC4,我创建了一个自定义验证属性,该属性实现了
IClientValidable
接口,如下所示:

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;
    }
(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'])。因此,客户端验证无法正常工作。服务器端验证工作正常,当我点击Submit时,它返回正确的反馈

注意:我也尝试过用正则表达式替换
params['pattern']
,效果很好


有人能帮我一下吗,因为我对JavaScript的了解不是很强。

尝试更改验证类型,使其与内置的正则表达式验证程序匹配。生成html时,会触发现有的正则表达式逻辑,因此不需要编写任何javascript

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    ModelClientValidationRule rule = new ModelClientValidationRule();
    rule.ErrorMessage = ErrorMessages.ClientFieldInputValidation;
    rule.ValidationType = "regex";
    rule.ValidationParameters.Add("pattern", _regEx);
    yield return rule;
}
public IEnumerable GetClientValidationRules(ModelMetadata元数据,ControllerContext上下文)
{
ModelClientValidationRule=新的ModelClientValidationRule();
rule.ErrorMessage=ErrorMessages.ClientFieldInputValidation;
rule.ValidationType=“regex”;
rule.ValidationParameters.Add(“模式”,_regEx);
收益率-收益率规则;
}

如果要在客户端验证的同时对一个数据对象应用多个正则表达式验证, 不能使用与“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"
        };
    }
}
然后,在客户端添加每个唯一的验证方法,如下所示

$.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");
/* }); */

您在最后一句话中是指Java还是JavaScript?感谢您提到不要将它们全部放在DOM就绪函数中。
/* $(function() { */
$.validator.addMethod("regularexpression", function (value, element, regexp) {
    var re = new RegExp(regexp); return re.test(value);
});
$.validator.unobtrusive.adapters.addSingleVal("regularexpression", "pattern");
/* }); */