我正在开发一个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中制作的,那么为什么我的工作不这样呢?
问题:
版本Detials
jQuery 1.11.0
jQuery.validation 1.8.1
Mircosoft.jQuery.Unobstrusive.Ajax 3.2.0
Mircosoft.jQuery.Unobstrusive.Validation 3.2.0
答案 0 :(得分:2)
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);
注册自定义适配器后手动(如果您不太关心性能)。