Asp.net mvc 为什么在document.ready运行之前必须添加自定义的不引人注目的验证程序方法?
我正在开发一个MVC4应用程序,需要对特定表单进行特定验证。因此,我遵循了(几个)教程,了解如何做到这一点。从自定义属性开始: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>
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调用,那么为什么我的示例不能以这种方式工作呢
问题:
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);