首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带参数的ASP.NET MVC3客户端验证

带参数的ASP.NET MVC3客户端验证
EN

Stack Overflow用户
提问于 2011-01-25 01:19:57
回答 1查看 32.4K关注 0票数 55

这篇文章的后续Perform client side validation for custom attribute

我正在试图弄清楚如何做到这一点,将额外的参数传递给客户端脚本

据我所知,到目前为止,要使用MVC3实现自定义验证,需要满足以下条件

创建自定义验证属性

基于ValidationAttribute和IClientValidatable的实现。我还看到一些来自ModelValidator的示例,它似乎同时实现了ValidationAttribute和IClientValidatable的功能。所以这是我困惑的第一点,关于区别是什么,或者ModelValidator是在MVC2中使用的,但现在已经被弃用了,还是别的什么?

必须从GetClientValidationRules()返回ModelClientValidationRule的一个实例,以指定诸如错误消息、ValidationType (我认为它是将执行客户端验证的Javascript函数的名称)以及该属性可能具有的、需要传递给Javascript验证的任何其他自定义参数等详细信息。

我假设运行时(不确定它的哪一部分)然后使用ModelClientValidationRule在标记元素中生成html属性,如下所示:

代码语言:javascript
复制
data-val="true"  (to indicate that the element requires validation)
data-val-[ValidationType]=[ErrorMessage]
data-val-[ValidationType].[ValidationParameters(n).Key]=[ValidationParameters(n).Value]

实现客户端验证逻辑

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

代码语言:javascript
复制
jQuery.validator.addMethod(
    'greaterThan', 
    function (value, element, params) {
        /.../
       return /* true or false   */ ; 
    },
    ''
); 

我这里的问题是,签名'function (value,element,params)‘是否是处理验证的方法的标准,我假设它会在适当的时候被一些jQuery功能调用,比如在提交表单之前,或者当元素失去功能时,或者在keyUp事件上。我只是不理解你如何控制它,也就是选择哪个事件适合你的自定义验证。

实现一个不显眼的适配器

这就将不显眼的属性转换成了一些我不太清楚的东西,但假设它是jQuery规则,但我不清楚这些规则是如何工作的。就像这样

代码语言:javascript
复制
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'. )的对象如果是这样,如何检索和映射自定义参数。

我希望我没有增加任何额外的混乱。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-25 01:24:43

您可以使用ValidationParameters属性将自定义参数添加到规则中:

代码语言:javascript
复制
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;
}

它可以在适配器中使用:

代码语言:javascript
复制
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
    }
);

更新:

按照注释部分的要求,下面是如何将这些参数传递给自定义验证器规则函数的方法:

代码语言:javascript
复制
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 ...
}, '');
票数 69
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4784943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档