我正在尝试为我的应用添加自定义不显眼的验证。它似乎没有运行验证。
这是我的属性类:
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;
});
答案 0 :(得分:31)
这里有很多可能出错的地方,没有涉及你发布的代码:
您为<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
等),因此无需自定义适配器
答案 1 :(得分:3)
$.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),一切正常。
答案 2 :(得分:0)
您必须更改服务器端。
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,它应该有“数据 - ”错误消息的文字
我希望它适合你。
答案 3 :(得分:0)
经过一些研究,我找到了一个很好的解决方案,用于在 Asp.Net Mvc 中进行自定义不显眼和服务器端验证。检查以下链接