ASP.NETMVC 3客户端参数验证如何实现?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (24)

继此之后对自定义属性执行客户端验证

我正试图让我的头脑知道如何做到这一点,并将其他参数传递给客户端脚本

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

创建一个自定义验证属性

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

必须从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']] 。如果是的话,如何检索和映射自定义参数。

提问于
用户回答回答于

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

扫码关注云+社区