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

Moo*_*oon 13 asp.net-mvc jquery jquery-validate asp.net-mvc-3

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

这是我的属性类:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
    ModelMetadata metadata, ControllerContext context)
{
    yield return new ModelClientValidationRule
    {
        ErrorMessage = ErrorMessage,
        ValidationType = "custrequired"
    };
}
Run Code Online (Sandbox Code Playgroud)

我的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;
});
Run Code Online (Sandbox Code Playgroud)

Jim*_*iTh 31

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

  • 你如何为<input>外观生成HTML ?它包含data-val-custrequired属性吗?

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

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

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

$(function () {
    $jQval.unobtrusive.parse(document);
});
Run Code Online (Sandbox Code Playgroud)

即,它在文档准备好的文档上解析验证属性,规则等.由于该脚本是为了注册您的适配器被加载,你的注册脚本通常要来 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');
Run Code Online (Sandbox Code Playgroud)

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

  • 在我的情况下,它没有工作,因为我在`$(document.ready()`里面的代码.真棒答案!帮了很多... (2认同)
  • 如果你真的想在 `$(function(){...})` 中设置你的验证器,你可以在方法 `$jQval.unobtrusive.parse(document);` 的末尾重新解析 (2认同)