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】:

这里有很多可能出错的地方,没有涉及到您发布的代码:

您为&lt;input&gt; 生成的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?

自定义格式日期的 MVC3 不显眼日期验证

使用 Select2 ASP.NET MVC 时进行不显眼的验证

Asp.Net MVC:不显眼的验证和脚本依赖

ASP.NET-MVC jQuery 不显眼的远程验证返回误报