jQuery验证:$ .data($('form')[0],'validator')。settings返回undefined

时间:2014-07-04 13:27:00

标签: javascript jquery asp.net forms validation

我有一个ASP.Net MVC项目,我正在使用不引人注目的jQuery验证。 当元素失去焦点时添加验证,我正在调用

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

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

  

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

然而,当按下提交按钮时,jQuery验证工作正常,因此其他所有内容都应该正确设置。

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

<script src="/Staffing/Scripts/jquery-2.1.1.js"></script>
<script src="/Staffing/Scripts/globalize/globalize.js"></script>
<script src="/Staffing/Scripts/globalize/cultures/globalize.culture.de-DE.js"></script>
<script src="/Staffing/Scripts/bootstrap.js"></script>
<script src="/Staffing/Scripts/respond.js"></script>
<script src="/Staffing/Scripts/bootstrap-datepicker.js"></script>
<script src="/Staffing/Scripts/bootstrap-datepicker-globalize.js"></script>
<script src="/Staffing/Scripts/locales/bootstrap-datepicker.de.js"></script>
<script src="/Staffing/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="/Staffing/Scripts/jquery.validate.js"></script>
<script src="/Staffing/Scripts/jquery.validate.globalize.js"></script>
<script src="/Staffing/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="/Staffing/Scripts/localization/messages_de.js"></script>
<script src="/Staffing/Scripts/customvalidations.js"></script>
<script src="/Staffing/Scripts/uiadditions.js"></script>
<script src="/Staffing/Scripts/default.js"></script>

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

$(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插件检查是否存在应该验证的任何元素,并且我在同一页面上有2个表单,第一个表单没有任何经验证的输入元素。

5 个答案:

答案 0 :(得分:16)

我刚刚升级到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]")。也就是说,如果您的表单没有具有该属性值的任何后代(如输入元素),则验证帮助程序将不会对其进行解析,也不会使用“验证程序”对其进行解析。数据将被分配给该表单元素。然后你会得到这个&#39; undefined&#39;如果您尝试在稍后阶段访问该表单的验证程序,则会出错。

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

希望有所帮助。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

您的项目看起来使用不同类型的validadion(其中一个使用不引人注意的,第二个使用默认值)。

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

<configuration>    
  <appSettings>        
    <add key="ClientValidationEnabled" value="true"/>        
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>    
  </appSettings>
</configuration>

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

如果没有表单时 - 您将收到错误

如果当有多个表单时 - 只有第一个表单将使用focusout 进行验证。

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

$(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(); };
    });
});

答案 3 :(得分:0)

首先查看表单数量,我认为您使用的表单不​​正确。

$(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(); };
   }
});

答案 4 :(得分:0)

执行此操作$.validator.unobtrusive.parse($("#base-modal form"));解决了我的问题