jquery.validate.unobtrusive不使用动态注入元素

xan*_*ndy 98 jquery-validate unobtrusive-validation asp.net-mvc-3

我正在使用ASP.Net MVC3,更简单的方法来使用客户端验证将启用jquery.validate.unobtrusive.对于那些来自服务器的东西,一切正常.

但是当我尝试用javascript注入一些新的"输入"时,我知道我需要调用$.validator.unobtrusive.parse()来重新绑定验证.但是,所有这些动态注入的字段都不起作用.

更糟糕的是,我尝试手动绑定使用jquery.validate它也无法正常工作.有什么想法吗?

vig*_*ity 157

我尝试了Xhalent的方法,但不幸的是它不适合我.罗宾的方法确实有效,但没有奏效.它适用于动态添加的元素,但如果您尝试使用JQuery从DOM中删除所有验证属性和跨度,验证库仍会尝试验证它们.

但是,如果除了"validationData"之外还删除了表单的"unobtrusiveValidation"数据,它就像一个动态添加和删除要验证或未验证的元素的工具.

$("form").removeData("validator");
$("form").removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse("form");
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.它适用于通过AJAX调用添加到ASP.MVC部分视图中添加到页面的内容. (4认同)
  • Xhalent起初也不适合我,然后我注意到parse应该传递给新元素的容器,而不是元素本身 - 快速修复将传递整个表单而不是元素 - 然后它像魅力一样工作. (2认同)

Xha*_*ent 66

我为jquery.validate.unobtrusive库创建了一个扩展,为我的情况解决了这个问题 - 它可能是有意义的.

http://xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-content/

  • 虽然这个答案已有3年多的历史,如果您可以在此网站上发布答案的基本部分,或者您的帖子有被删除的风险,那将非常有用[请参阅常见问题解答,其中提到的答案仅仅是link'.](http://stackoverflow.com/faq#deletion)如果您愿意,您仍可以包含该链接,但仅作为"参考".答案应该独立而不需要链接. (7认同)
  • 这个答案应该至少包含博客文章的熊骨头.仅链接答案通常是SO的主题 (5认同)

lam*_*tor 41

我实际上非常喜欢@viggity和@Robins解决方案的简单性,所以我把它变成了一个快速的小插件:

(function ($) {

    $.fn.updateValidation = function () {
        var $this = $(this);
        var form = $this.closest("form")
            .removeData("validator")
            .removeData("unobtrusiveValidation");

        $.validator.unobtrusive.parse(form);

        return $this;
    };
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

用法示例:

$("#DischargeOutcomeNumberOfVisits")
    .attr("data-val-range-min", this.checked ? "1" : "2")
    .updateValidation();
Run Code Online (Sandbox Code Playgroud)


Rob*_*aap 32

我遇到了同样的问题.我发现不可能在同一个表单上调用$ .validator.unobtrusive.parse()两次.最初从服务器加载表单时,表单由不显眼的库自动解析.当您将一个输入元素动态添加到窗体并再次调用$ .validator.unobtrusive.parse()时,它将无法正常工作.parseElement()也是如此.

不显眼的lib调用jquery validate插件的validate方法来设置所有规则和消息.问题是,当再次调用时,插件不会更新其给定的新规则集.

我找到了一个粗略的解决方案:在不显眼的lib上调用parse方法之前,我扔掉了表单验证器:

$('yourForm').removeData("validator");
Run Code Online (Sandbox Code Playgroud)

现在,当不显眼的lib调用validate方法时,将重新创建所有规则和消息,包括动态添加的输入.

希望这可以帮助

  • 来自Brad Wilsons博客:"您还可以调用jQuery.validator.unobtrusive.parseElement()函数来解析单个HTML元素." 有帮助吗? (2认同)
  • 解决方案有点粗糙,因为所有验证器都被删除并再次恢复,包括动态添加的验证器.如果只更新动态添加的验证器会更好.@Xhalent在他的回答中提供了一个更清晰的解决方案,但基本上来自MS的不显眼的库应该针对这种情况进行更新. (2认同)

Sun*_*abu 9

我使用MVC 4和JQuery 1.8,看起来像需要以下的代码块,以使jQuery来验证通过Ajax,或Jquery的动态内容注入到DOM.

我创建了一个模块化函数,它接受新添加元素的Jquery对象.如果您tblContacts在单击按钮时使用Jquery 克隆了具有id的新表,则在js文件中包含以下函数

function fnValidateDynamicContent(element) {
    var currForm = element.closest("form");
    currForm.removeData("validator");
    currForm.removeData("unobtrusiveValidation");
    $.validator.unobtrusive.parse(currForm);
    currForm.validate(); // This line is important and added for client side validation to trigger, without this it didn't fire client side errors.
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

fnValidateDynamicContent("#tblContacts")
Run Code Online (Sandbox Code Playgroud)


Ben*_*ger 9

我尝试了 vivigity 的答案,起初一切似乎都有效。但过了一段时间,我注意到我添加的动态项目越多,验证速度就越慢。原因是他的解决方案不会解除事件处理程序的绑定,而是每次都添加新的事件处理程序。因此,如果添加 5 个项目,验证将执行 6 次,而不是仅执行一次。要解决此问题,您必须将事件与removeData 调用一起解除绑定。

$("form").removeData("validator")
         .removeData("unobtrusiveValidation")
         .off("submit.validate click.validate focusin.validate focusout.validate keyup.validate invalid-form.validate");
$.validator.unobtrusive.parse("form");
Run Code Online (Sandbox Code Playgroud)