jQueryvalidation:$ .data($(’form’),’validator’)。settings返回undefined

我有一个ASP.Net MVC项目,我正在使用不引人注目的jQueryvalidation。 当一个元素失去焦点时添加validation,我正在打电话

$(document).ready(function () { // enable validation when an input loses focus. var settngs = $.data($('form')[0], 'validator').settings; settngs.onfocusout = function (element) { $(element).valid(); }; }); 

这是在一个项目上工作,而它在另一个项目上抛出此exception,因为$ .data($(’form’)[0],’validator’)返回undefined($ .data($(’form’)[0])返回一个空对象):

未捕获的TypeError:无法读取未定义的属性“设置”

但是,当按下提交按钮时,jQueryvalidation工作正常,因此应该正确设置其他所有内容。

我在body标签的末尾加载这些脚本:(上面列出的函数在customvalidations.js中,所以它应该在validation器应用到表单后执行)

                 

解决方案:这是有效的代码:

 $(document).ready(function () { // enable validation when an input loses focus. var allForms = $('form'); $.each(allForms, function (key, value) { var val = $.data(value, 'validator'); if (val != undefined) { var settngs = val.settings; settngs.onfocusout = function (element) { $(element).valid(); }; }}); }); 

问题是新的Validation插件检查是否存在任何应该被validation的元素,并且我在同一页面上有2个表单,第一个表单没有任何经过validation的输入元素。

我刚刚升级到Microsoft.jQuery.Unobtrusive.Validation.3.2.0包。 我遇到了同样的问题。 您是否有可能升级到相同版本?

如果是这样,我可能会提供我的两分钱:)。 经过一些调试后,我注意到在jquery.validate.unobtrusive.js中进行了以下更改:

以前的版本:

  var $forms = $(selector) .parents("form") .andSelf() .add($(selector).find("form")) .filter("form"); 

新版本:

  $forms = $selector.parents() .addBack() .filter("form") .add($selector.find("form")) .has("[data-val=true]"); // key point! 

关键似乎是: has("[data-val=true]") 。 也就是说,如果您的表单没有具有该属性值的任何后代(如输入元素),则validation帮助程序将不会对其进行解析,并且不会将“validation程序”数据分配给该表单元素。 如果您尝试在稍后阶段访问该表单的validation器,则会出现此“未定义”错误。

就我而言,发生这种情况的表单实际上并没有使用任何validation,因此它们没有这个属性。 然后,我可以更改自定义validation器逻辑,以在更改validation器设置之前首先检查validation器是否存在。

希望有所帮助。

如果你没有在表单上调用validate(),也会发生这种情况:

 $("#your_form").validate(); 

在我的情况下,我的页面上没有id为“your_form”的表单,因此在尝试添加规则时会导致此错误。

看起来您的项目使用不同类型的validadion(其中一个使用不显眼和第二个使用默认值)。

请检查您是否在两个项目的web.config中使用下一个设置。

       

您也尝试使用文档中的第一个表单。

如果没有表格 – 你会收到错误

如果有多个表单 – 只有第一个表单将使用focusout进行validation。

所以你应该为每个表单做同样的事情:

 $(document).ready(function () { var $forms = $('form'); $.each($forms, function (key, value) { // enable validation when an input loses focus. var settings = $.data(value, 'validator').settings; settings.onfocusout = function (element) { $(element).valid(); }; }); }); 

首先结帐表格数量,我认为您使用的表格不正确。

 $(document).ready(function () { // enable validation when an input loses focus. if($('form').length > 0) { // $('form')[0] is it proper form? var settngs = $.data($('form')[0], 'validator').settings; settngs.onfocusout = function (element) { $(element).valid(); }; } }); 

这样做$.validator.unobtrusive.parse($("#base-modal form")); 解决了我的问题