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"));
разрешило мою проблему