Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 为什么在document.ready运行之前必须添加自定义的不引人注目的验证程序方法?_Asp.net Mvc_Jquery Validate_Unobtrusive Validation - Fatal编程技术网

Asp.net mvc 为什么在document.ready运行之前必须添加自定义的不引人注目的验证程序方法?

Asp.net mvc 为什么在document.ready运行之前必须添加自定义的不引人注目的验证程序方法?,asp.net-mvc,jquery-validate,unobtrusive-validation,Asp.net Mvc,Jquery Validate,Unobtrusive Validation,我正在开发一个MVC4应用程序,需要对特定表单进行特定验证。因此,我遵循了(几个)教程,了解如何做到这一点。从自定义属性开始: public class CheckDuplicateElementNameAttribute : ValidationAttribute, IClientValidatable { // Server side check omitted public IEnumerable<ModelClientValidationRule>

我正在开发一个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;
  }
}
最后在页面中添加了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)显示了从document.ready中进行的addMethod调用,那么为什么我的示例不能以这种方式工作呢

问题:

  • 为什么会这样
  • 默认适配器何时注册?在加载html之前,它们如何解析html
  • 在慢速连接上是否存在验证适配器仍无法及时注册的风险
  • 版本详情

    jQuery 1.11.0

    jQuery.validation 1.8.1

    Mircosoft.jQuery.unobstructive.Ajax 3.2.0

    Brad Wilson提供的Mircosoft.jQuery.unobstructive.Validation 3.2.0

    涵盖了您的所有问题

    1这是为什么

    请参阅文章的解析新HTML以进行验证。上面说

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

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

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

    2默认适配器何时注册?在加载html之前,它们如何解析html

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

    jQuery.validator.unobtrusive.adapters上有一个可用的适配器集合

    您可以查看以确保所有初始化(以及默认适配器)都正确地发生在脚本中,脚本在页面文档准备就绪之前执行

    文档解析发生在脚本的末尾-在它的document ready函数中:

    $(function () {
        $jQval.unobtrusive.parse(document);
    });
    
    3是否存在在慢速连接上验证适配器仍无法及时注册的风险

    好吧,这根本没有什么神奇之处,如果您正确理解脚本行为,并且以正确的方式进行初始化,那么一切都会好起来:)

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

    1) 在文档外注册它们,就像一切正常时一样

    2) 在documentready函数中注册它们,但将包含jquery.validate.unobtrusive.js的标签移动到documentready函数下面

    3) 召唤

    注册自定义适配器后手动操作(如果您不太关心性能)。

    Brad Wilson为您解答了所有问题

    1这是为什么

    请参阅文章的解析新HTML以进行验证。上面说

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

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

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

    2默认适配器何时注册?在加载html之前,它们如何解析html

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

    jQuery.validator.unobtrusive.adapters上有一个可用的适配器集合

    您可以查看以确保所有初始化(以及默认适配器)都正确地发生在脚本中,脚本在页面文档准备就绪之前执行

    文档解析发生在脚本的末尾-在它的document ready函数中:

    $(function () {
        $jQval.unobtrusive.parse(document);
    });
    
    3是否存在在慢速连接上验证适配器仍无法及时注册的风险

    好吧,这根本没有什么神奇之处,如果您正确理解脚本行为,并且以正确的方式进行初始化,那么一切都会好起来:)

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

    1) 在文档外注册它们,就像一切正常时一样

    2) 在documentready函数中注册它们,但将包含jquery.validate.unobtrusive.js的标签移动到documentready函数下面

    3) 召唤

    注册自定义适配器后手动执行(如果您不太关心性能)

    jQuery.validator.unobtrusive.parse(document);