为什么必须在document.ready运行之前添加自定义Unobtrusive Validator方法?

时间:2014-07-15 16:52:35

标签: asp.net-mvc jquery-validate unobtrusive-validation

我正在开发一个MVC4应用程序,需要对特定表单进行一些特定的验证。所以我跟着(几个)关于如何做到这一点的教程。从自定义属性开始:

public class CheckDuplicateElementNameAttribute : 
    ValidationAttribute, IClientValidatable
{
  // Server side check omitted
  public IEnumerable<ModelClientValidationRule>
        GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
  {
        ModelClientValidationRule rule = new ModelClientValidationRule();
        rule.ErrorMessage = this.ErrorMessage;
        rule.ValidationType = "elementname";
        yield return rule;
  }
}

然后我将属性添加到模型的属性中:

public class HygieneElementModel
{

    [CheckDuplicateElementName
        (ErrorMessage="There is already an element with that name")]
    public string ShortName { get; set; }

}

最后将js方法添加到页面中:

$(document).ready(function () {
        jQuery.validator.addMethod('elementname', function (val, element) {
        console.log('validating');
        return false;
    }, '');

    jQuery.validator.unobtrusive.adapters.add('elementname', {}, function (options) {
        options.rules['elementname'] = true;
        options.messages['elementname'] = options.message;
    });

    jQuery.validator.unobtrusive.parse();
}

验证方法完全无法运行。当我将这些行移出document.ready函数并让它们在加载后立即运行时,它可以正常工作。现在,我所遵循的很多例子 - 其中许多来自SO,显示了addMethod调用是在document.ready中制作的,那么为什么我的工作不这样呢?

问题:

  1. 这是为什么?
  2. 什么时候注册了默认适配器?它们如何解析html之前的loades?
  3. 在慢速连接上是否存在风险,验证适配器仍然无法按时注册?
  4. 版本Detials

    jQuery 1.11.0

    jQuery.validation 1.8.1

    Mircosoft.jQuery.Unobstrusive.Ajax 3.2.0

    Mircosoft.jQuery.Unobstrusive.Validation 3.2.0

1 个答案:

答案 0 :(得分:2)

来自Brad Wilson的

This article涵盖了您的所有问题。

  

1为什么会这样?

请参阅本文的解析用于验证的新HTML 。它说

  

不显眼的客户端验证脚本会在页面加载完成后自动解析初始HTML集以获取验证规则。如果您的页面动态添加新的HTML内容(可能是通过Ajax或通过客户端应用程序代码),您可能希望解析新的HTML以便在新的HTML元素上进行客户端验证。

     

要解析新的HTML,您可以调用jQuery.validator.unobtrusive.parse()方法,向其传递一个您想要解析的HTML的选择器。

我相信jquery.validate.unobtrusive.js包含在之前你的文档就绪函数中,因为它使用了它自己的文档就绪函数来解析html页面 - 它不使用你的适配器,因为此时尚未执行文档就绪处理程序(没有可用的自定义适配器)。当您将适配器添加到文档就绪功能之外时,它们可以在jquery.validate.unobtrusive.js的文档准备就绪。

  

2什么时候注册了默认适配器?它们如何解析html才能进行loades?

请参阅文章的桥接HTML和jQuery验证:适配器部分:

  

jQuery.validator.unobtrusive.adapters上有一个适配器集合。

您可以看到jquery.validate.unobtrusive.js source code以确保所有初始化(默认适配器)都在脚本中发生,再次在页面文档准备好之前执行。

文档解析发生在脚本的末尾 - 在文档就绪函数中:

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

3是否存在在慢速连接时仍无法按时注册验证适配器的风险?

嗯 - 没有任何魔法,如果你正确理解脚本行为,并且你以正确的方式进行初始化,那一切都会好的:)

为确保您的适配器正在使用,您可以:

1)将它们准备好在文件准备就绪之前,就像你工作时一样。

2)在文档就绪函数中注册它们,但移动<script>标记,其中包括文档就绪函数下面的jquery.validate.unobtrusive.js。

3)致电

jQuery.validator.unobtrusive.parse(document);
注册自定义适配器后手动

(如果您不太关心性能)。