ASP .Net MVC 3:自定义不显眼的validation

我正在尝试为我的应用添加自定义不显眼的validation。 它似乎没有运行validation。

这是我的属性类:

public IEnumerable GetClientValidationRules( ModelMetadata metadata, ControllerContext context) { yield return new ModelClientValidationRule { ErrorMessage = ErrorMessage, ValidationType = "custrequired" }; } 

我的JavaScript:

 $.validator.addMethod('custrequired', function(value, element, param) { return value && value !== '99:99' && value !== '9:99'; }); $.validator.unobtrusive.adapters.add('custrequired', null, function(options) { return options.messages['custrequired'] = options.message; }); 

这里有很多可能出错的东西,没有涉及你发布的代码:

  • 您为生成的HTML如何显示? 它是否包含data-val-custrequired属性?

  • 如果没有,你还记得在类声明中添加接口 – IClientValidatable吗?

  • 你还记得不在 DOM ready处理程序中添加自定义validation器吗? (即不要使用$(document).ready()$(function() { ... }) ) – 应在文档准备好之前设置validation。

ETA :最后一个的原因是jquery.validate.unobtrusive这样做:

 $(function () { $jQval.unobtrusive.parse(document); }); 

即,它在文档准备好的文档上解析validation属性,规则等。 由于必须加载该脚本才能注册适配器,因此注册脚本通常必须 jquery.validate.unobtrusive.js 之后 。 但是这也使你注册的任何.ready处理程序在“不显眼” 之后被调用 – 到那时为时已晚。 我想你可以先放置你的注册脚本然后再使用.ready 。 没试过,我从未见过它。

此外,在这种情况下,这应该足以注册适配器:

 $.validator.addMethod('custrequired', function(value, element, param) { return value && value !== '99:99' && value !== '9:99'; }); jQuery.validator.unobtrusive.adapters.addBool('custrequired'); 

它仍会添加您可能拥有的任何自定义错误消息,但由于您的validation器未使用其他参数(例如StringLength传递MaximumLength等),因此不需要自定义适配器。

$.validator.unobtrusive.adapters.add调用存在一些问题:

 $.validator.unobtrusive.adapters.add('custrequired', function (options) { // -------------------------------------------------^ <-- removed "null" param options.messages['custrequired'] = options.message; // Register the rule properly options.rules['custrequired'] = options.params; // Don't return anything }); 

在这两个更改(并确保在web.config中启用ClientValidation和UnobtrusiveJavascript)之后,一切正常。

您必须更改服务器端。

  public IEnumerable GetClientValidationRules( ModelMetadata metadata, ControllerContext context) { //I changed ErrorMessage for ErrorMessageString yield return new ModelClientValidationRule { ErrorMessage = ErrorMessageString, ValidationType = "custrequired" }; } 

而且正如安德烈·惠特克(Andre Whitaker)所说,你必须把它用于为客户添加你的validation。

  //i changed param for params $.validator.addMethod('custrequired', function(value, element, params) { return value && value !== '99:99' && value !== '9:99'; }); //i specified that there isn't paramaters using an empty array. $.validator.unobtrusive.adapters.add('custrequired', [] , function (options) { options.messages['custrequired'] = options.message; options.rules['custrequired'] = options.params; }); 

记得检查输入的HTML,它应该有你的错误信息的“数据”属性文本

我希望这个对你有用。