【问题标题】:ASP.NET MVC 3 client-side validation with parameters带有参数的 ASP.NET MVC 3 客户端验证
【发布时间】:2011-06-14 16:06:57
【问题描述】:

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

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

据我所知,到目前为止,使用 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   */ ; 
    },
    ''
); 

我的问题是签名“函数(值,元素,参数)”是否是处理验证的方法的标准,我假设它会在适当的时间被一些 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'] . 如果是这样,如何检索和映射自定义参数。

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

【问题讨论】:

  • 不显眼的验证意味着 HTML 属性被添加到元素上,例如 data-max-value="5" 并且正文内容之外的 javascript 会查找这些并执行验证,而不是直接在HTML 元素。

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


【解决方案1】:

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

更新:

根据 cmets 部分的要求,您可以将这些参数传递给自定义验证器规则函数:

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 ...
}, '');

【讨论】:

  • 不错不错。您能否还请说明我将如何在执行验证的脚本中引用这些参数。这就是我现在卡住的地方。我了解验证的方法签名是函数(值、元素、参数),但不确定 param1 和 param2 是如何传递给它的
  • @ricardo,关于您的第一个问题,ModelValidator 允许您实现与 IClientValidatable 相同的事情,因为它公开了 GetClientValidationRules 方法。就您的第二个问题而言,这是 jquery 验证。
  • @ricardo,ValidationAttribute 作用于模型的单个属性,而 ModelValidator 作用于整个模型。
  • ModelValidator 方法来自 MVC2,在我看来,不应该在 MVC3 项目中继续使用。 MVC3 ValidationAttribute/IClientValidatable 方法更简洁,不需要修改 global.asax 来注册适配器。
  • 天哪,这一系列的 cmets 正是我所需要的。我一直在使用我更新到 mvc 3 的 mvc 2 站点。它有一个自定义的“RequiredIf”ValidationAttribute,它使用 DataAnnotationsModelValidator 以及此处描述的所有内容:haacked.com/archive/2009/11/19/…。我对旧方法和这些新的 mvc3 方法感到非常困惑。显然他们实现了同样的目标。感谢微软的文档(和提示)! sigh 感谢 Darin、ricardo 和 The Flower Guy!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
相关资源
最近更新 更多