ASP.NET MVC 3带参数的客户端验证

时间:2011-01-24 17:19:57

标签: asp.net-mvc validation asp.net-mvc-3 parameters client-side

继续发表此帖[{3}}

我试图了解如何执行此操作,将其他参数传递给客户端脚本

据我所知,到目前为止,使用MVC 3实现自定义验证需要以下内容

创建自定义验证属性

基于ValidationAttribute并实现IClientValidatable。我还看到了一些源自ModelValidator的示例,它似乎实现了ValidationAttribute和IClientValidatable的功能。所以这是关于差异是什么或者ModelValidator是否在MVC 2中使用但现在已被弃用或者是什么的第一个混淆点?

必须从GetClientValidationRules()返回ModelClientValidationRule的实例,以指定详细信息,例如错误消息,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]

实施客户端验证逻辑

必须使用jQuery.validators.addmethod()创建Javascript函数并将其添加到jQuery.validators中,以便JQuery在需要执行时知道它。类似的东西:

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

我的问题是签名'function(value,element,params)'是否是处理验证的方法的标准,我认为它将在适当的时候被某些jQuery功能调用,例如在提交表单之前或当一个元素失去了fuces或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']如果是这样,如何检索和映射自定义参数。

我希望我没有添加任何额外的混淆。

1 个答案:

答案 0 :(得分:65)

您可以使用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 ...
}, '');