проверка на стороне клиента с динамически добавляемым полем

Я использую ненавязчивый плагин проверки jQuery с ASP.NET MVC. Все поля, отображаемые на сервере, проверяются надлежащим образом.

Однако, если я динамически добавляю поле в форму с помощью JavaScript, оно не проверяется, даже если оно имеет соответствующие атрибуты HTML5 data-*.

Может ли кто-нибудь направить меня в правильном направлении о том, как я могу достичь этой цели?


person Muhammad Adeel Zahid    schedule 11.05.2011    source источник


Ответы (3)


Более простой ответ:

Я использую MVC 4 и JQuery 1.8. Я сделал это с помощью модульной функции, которая принимает объект jQuery только что добавленного элемента:

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.
}

Например, если вы добавили новую таблицу с идентификатором tblContacts, то вы можете вызвать ее следующим образом:

fnValidateDynamicContent($("#tblContacts"))
person Sundara Prabu    schedule 28.02.2013
comment
Отличная находка! В моем ограниченном тестировании это, кажется, работает. Обратите внимание, что currform в последней строке кода должен быть currForm (заглавная F). - person eSamuel; 05.01.2014
comment
Я предполагаю, что вы имели в виду fnValidateDynamicContent($(#tblContacts)) ? - person Stephen Oberauer; 01.02.2015

Вот запись в блоге, которая может оказаться полезной. поставить вас на правильный путь. Метод расширения взят оттуда:

/// <reference path="jquery-1.4.4.js" />
/// <reference path="jquery.validate.js" />
/// <reference path="jquery.validate.unobtrusive.js" />

(function ($) {
  $.validator.unobtrusive.parseDynamicContent = function (selector) {
    //use the normal unobstrusive.parse method
    $.validator.unobtrusive.parse(selector);

    //get the relevant form
    var form = $(selector).first().closest('form');

    //get the collections of unobstrusive validators, and jquery validators
    //and compare the two
    var unobtrusiveValidation = form.data('unobtrusiveValidation');
    var validator = form.validate();

    $.each(unobtrusiveValidation.options.rules, function (elname, elrules) {
      if (validator.settings.rules[elname] == undefined) {
        var args = {};
        $.extend(args, elrules);
        args.messages = unobtrusiveValidation.options.messages[elname];
        $('[name="' + elname + '"]').rules("add", args);
      } else {
        $.each(elrules, function (rulename, data) {
          if (validator.settings.rules[elname][rulename] == undefined) {
            var args = {};
            args[rulename] = data;
            args.messages = unobtrusiveValidation.options.messages[elname][rulename];
            $('[name="' + elname + '"]').rules("add", args);
          }
        });
      }
    });
  }
})($);

а потом:

var html = "<input data-val='true' "+
           "data-val-required='This field is required' " +
           "name='inputFieldName' id='inputFieldId' type='text'/>;
$("form").append(html);

$.validator.unobtrusive.parseDynamicContent('form input:last');

Обновлено, чтобы добавить исправление, указанное в комментариях к сообщению в блоге, в противном случае возникают ошибки js.

person Darin Dimitrov    schedule 11.05.2011
comment
когда я немного отлаживаю его, ему удается пропустить часть условия if и else - person Muhammad Adeel Zahid; 12.05.2011
comment
дальнейшая отладка показывает, что var unobtrusiveValidation = form.data('unobtrusiveValidation'); является источником ошибки и не получает правила для вновь добавленных полей. - person Muhammad Adeel Zahid; 12.05.2011
comment
Работал как шарм. Спасибо! - person jfren484; 06.11.2015

Чтобы ответ Дарина работал, я изменил следующую строку:

$.validator.unobtrusive.parse(selector); 

К этому:

 $(selector).find('*[data-val = true]').each(function(){
    $.validator.unobtrusive.parseElement(this,false);
 });

Вот полный образец:

(function ($) {
  $.validator.unobtrusive.parseDynamicContent = function (selector) {
    // don't use the normal unobstrusive.parse method
    // $.validator.unobtrusive.parse(selector); 

     // use this instead:
     $(selector).find('*[data-val = true]').each(function(){
        $.validator.unobtrusive.parseElement(this,false);
     });
    
    //get the relevant form
    var form = $(selector).first().closest('form');

    //get the collections of unobstrusive validators, and jquery validators
    //and compare the two
    var unobtrusiveValidation = form.data('unobtrusiveValidation');
    var validator = form.validate();

    $.each(unobtrusiveValidation.options.rules, function (elname, elrules) {
      if (validator.settings.rules[elname] == undefined) {
        var args = {};
        $.extend(args, elrules);
        args.messages = unobtrusiveValidation.options.messages[elname];
        $('[name="' + elname + '"]').rules("add", args);
      } else {
        $.each(elrules, function (rulename, data) {
          if (validator.settings.rules[elname][rulename] == undefined) {
            var args = {};
            args[rulename] = data;
            args.messages = unobtrusiveValidation.options.messages[elname][rulename];
            $('[name="' + elname + '"]').rules("add", args);
          }
        });
      }
    });
  }
})($);

$.validator.unobtrusive.parse внутренне вызывает метод parseElement, но каждый раз он отправляет параметру isSkip значение true, поэтому с этим значением

if (!skipAttach) {
    valInfo.attachValidation();
}

этот код в jquery.unobtrusive.js не прикрепляет проверку к элементу, и мы находим только данные проверки входных данных, которые изначально присутствовали на странице.

Примечание Ответ Дарина выше правильный, и вы можете найти в блоге, на который он ссылался, что многие люди решили проблему, используя код xhalent (опубликовано darin). почему это не сработало, выше моего понимания. Кроме того, вы можете найти множество сообщений, в которых рассказывается ты просто звонишь

$.validator.unobtrusive.parse(selector) 

достаточно для проверки динамически загружаемого контента

person Muhammad Adeel Zahid    schedule 12.05.2011
comment
Для всех, кто использует это, я рекомендую вам изменить еще одну вещь, особенно если вы используете это для динамических коллекций в MVC: $('[name=' + escapeAttributeValue(elname) + ']'), где escapeAttributeValue делает имя jquery selector-safe: return value.replace(/([!#\$%&'()*\+,\.\/:;‹=›\?@[\\]\^`\{\ |\}~])/g, '\\$1'); - person Zach; 05.02.2013
comment
$.validator.unobtrusive.parse(selector) работает только для новой добавленной формы. Если у вас уже есть существующая форма и вы вставляете в нее новые поля ввода, это не сработает. - person YuMei; 15.08.2013