ASP .Net MVC 3:自定义不显眼的验证
Posted
技术标签:
【中文标题】ASP .Net MVC 3:自定义不显眼的验证【英文标题】:ASP .Net MVC 3: Custom unobtrusive validation 【发布时间】:2012-03-03 23:45:55 【问题描述】:我正在尝试向我的应用程序添加自定义不显眼的验证。它似乎没有运行验证。
这是我的属性类:
public IEnumerable<ModelClientValidationRule> 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;
);
【问题讨论】:
【参考方案1】:这里有很多可能出错的地方,没有涉及到您发布的代码:
您为<input>
生成的html 看起来如何?是否包含data-val-custrequired
属性?
如果没有,是否记得在类声明中添加接口 - IClientValidatable
?
您是否记得不在DOM ready
处理程序中添加您的自定义验证器? (即不要使用$(document).ready()
或$(function() ... )
) - 应在文档准备好之前设置验证。
ETA:最后一个原因是jquery.validate.unobtrusive
这样做:
$(function ()
$jQval.unobtrusive.parse(document);
);
即,它会在文档就绪时解析文档以获取验证属性、规则等。由于必须加载该脚本才能注册您的适配器,因此您的注册脚本通常必须在 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');
它仍会添加您可能拥有的任何自定义错误消息,但由于您的验证器没有使用其他参数(例如 StringLength
传递 MaximumLength
等),因此不需要自定义适配器。
【讨论】:
我在$(function() ... )
中添加了验证器...我能知道这不起作用的原因吗?
@Moon - 编辑并尝试解释。
在我的情况下它不起作用,因为我在 $(document.ready()
中有代码。真棒答案!帮了大忙……
+1 救了我。很多解决方案,无论是在 SO 上还是在 Web 上,但都没有提到不要在 DOM 就绪处理程序中添加自定义验证器。
如果你真的想在 $(function()...)
中设置你的验证器,你可以在方法的末尾重新解析 $jQval.unobtrusive.parse(document);
【参考方案2】:
$.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),一切正常。
【讨论】:
非常感谢您的回复。但仍然无法让它工作。【参考方案3】:你必须改变服务器端。
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ModelMetadata metadata, ControllerContext context)
//I changed ErrorMessage for ErrorMessageString
yield return new ModelClientValidationRule
ErrorMessage = ErrorMessageString,
ValidationType = "custrequired"
;
正如安德烈·惠特克所说,你必须把它添加到客户端验证。
//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,它应该具有带有错误消息文本的“data-”属性
我希望它对你有用。
【讨论】:
【参考方案4】:经过一些研究,我找到了一个在 Asp.Net Mvc 中自定义不显眼和服务器端验证的好解决方案。检查以下链接
Raymund Macaalay
【讨论】:
以上是关于ASP .Net MVC 3:自定义不显眼的验证的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP NET MVC 中自定义不显眼的验证 JQuery 消息?
ASP.net MVC 3 jQuery 验证;禁用不显眼的 OnKeyUp?