JQuery Validation: $.data($ ('form') [0], 'validator'). settings возвращает undefined

У меня есть проект 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]) возвращает пустой объект):

Uncaught TypeError: невозможно прочитать настройки свойств undefined

Однако jQuery Validation отлично работает при нажатии кнопки отправки, поэтому все остальное должно быть правильно настроено.

Я загружаю эти скрипты в конец тега 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 проверяет наличие каких-либо элементов, которые должны быть проверены, и у меня было две формы на одной странице, причем первая форма не имела никаких проверенных входных элементов.

Ответ 1

Я только что обновил пакет 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]"). То есть, если ваша форма не имеет потомков (например, элемента ввода) с этим значением атрибута, она не будет анализироваться помощником проверки, и никакие данные "валидатора" не будут присвоены этому элементу формы. Затем вы получите эту ошибку "undefined", если попытаетесь получить доступ к валидатору этой формы на более позднем этапе.

В моем случае формы, для которых это происходило, фактически не использовали какую-либо проверку, поэтому у них не было этого атрибута. Затем я смог изменить свою собственную логику валидатора, чтобы сначала проверить, существует ли валидатор перед изменением настроек валидатора.

Надеюсь, что это поможет.

Ответ 2

Это может произойти и в том, что вы не вызывали validate() в своей форме как таковой:

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

В моем случае у меня не было формы с идентификатором "your_form" на моей странице, что вызывало эту ошибку при попытке добавить правила.

Ответ 3

Похоже, ваши проекты используют разные типы validadion (один из них использует ненавязчивое и второе использование по умолчанию).

Проверьте, используете ли вы следующие настройки в файле web.config обоих проектов.:

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

Также вы пытаетесь работать с первой формой в своем документе.

В случае , когда нет форм, вы получите сообщение об ошибке.

В случае , когда имеется более одной формы - только первая форма будет использовать фокус для проверки.

Итак, вы должны сделать то же самое для каждой формы:

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

Ответ 4

Сначала проверьте количество форм, я думаю, что вы используете неправильную форму.

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

Ответ 5

Выполнение этой $.validator.unobtrusive.parse($("#base-modal form")); разрешило мою проблему