使用参数进行ASP.NET MVC 3客户端validation

继续从这篇文章执行自定义属性的客户端validation

我试图让我的头如何做到这一点,传递额外的参数到客户端脚本

据我了解,到目前为止实现自定义validation与MVC 3以下是必需的

创build一个自定义validation属性

基于ValidationAttribute并实现IClientValidatable。 我也看到一些从ModelValidator派生的例子,它似乎实现了ValidationAttribute和IClientValidatable的function。 所以这是我第一个混淆的地方在于MVC 2中使用了ModelValidator,但是现在已经被弃用或者是什么了?

必须从GetClientValidationRules()返回一个ModelClientValidationRule实例来指定详细信息,如错误消息,ValidationType(我知道它是执行客户端validation的Javascript函数的名称)以及任何其他自定义参数可能有,并且需要被传递给Javascriptvalidation。

我假设运行时(不知道它的哪一部分)然后使用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] 

实现客户端validation逻辑

必须使用jQuery.validators.addmethod()创buildJavascript函数并将其添加到jQuery.validators中,以便JQuery在需要执行时知道它。 就像是:

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

我的问题是这个签名的'function(value,element,params)'是否是处理validation的方法的标准,我认为它会在适当的时候被一些jQuery的function调用,比如在提交表单之前或者元素失去fuces或keyUp事件。 我只是不知道如何控制这个,即select哪个事件适合自定义validation。

实施一个不显眼的适配器

这翻译不显眼的属性; 我不是很清楚,但假设它是一个jQuery规则,但我不清楚这些如何工作。 就像是

 jQuery.validator.unobtrusive.adapters.add( 'futuredate', { }, function (options) { options.rules['greaterThan'] = true; options.messages['greaterThan'] = options.message; } ); 

我的问题在于“function(选项)”。 这个函数是在函数(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 } ); 

更新:

按照注释部分的要求,您可以将这些parameter passing给自定义validation器规则函数:

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