客户端自定义非侵入式验证不起作用

本文关键字:验证 不起作用 自定义 客户端 | 更新日期: 2023-09-27 18:21:04

使用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:var regEx = RegExp(params['pattern']);的第3行中找到。因此,客户端验证工作不正常。服务器端验证运行良好,因为当我点击Submit时,它会返回正确的反馈。

注意:我也尝试过用正则表达式来代替params['pattern'],它工作得很好。

有人能帮我吗?因为我对JavaScript的了解不是你所说的那么强。

客户端自定义非侵入式验证不起作用

如果要在客户端验证的同时对一个数据对象应用多个正则表达式验证,您不能使用与"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");
/* }); */

尝试更改验证类型,使其与内置的RegEx验证器匹配。当生成html时,现有的RegEx逻辑会触发,因此您不需要编写任何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;
}