2016-02-18 3 views
0

Это что-то странное. На SO есть много вопросов относительно установки свойства ignore для объекта settings ненавязчивой проверки.Ненавязчивая настройка «игнорировать» не работает

Сценарий: У меня есть таблица, созданная путем итерации по модели в MVC, и я автоматически заполняю пустую строку внизу, вставляя пустую модель со стороны сервера (это часть требований, не подлежащая обсуждению) , Я не хочу проверять эту пустую строку, если пользователь ее не коснулся, но если есть.

Чтобы решить эту проблему, я генерирую таблицу как обычно. Используя jquery, я автоматически отмечаю любые пустые строки классом «blank». Я вижу, что это происходит только для пустых строк в таблице, просматривая источник.

Теперь, если в обращении document.read() к клиенту у меня есть;

$.validator.unobtrusive.parse('form'); 
var form = $('form').get(0); 
var settings = $.data(form, 'validator').settings; 
settings.ignore = ':hidden,.blank'; 

Это работает просто отлично. Нажатие submit не запускает проверку на пустые строки, даже когда я добавляю новые. Однако валидация не выполняется ни в одной из заполненных строк, кроме первой строки.

Чтобы решить эту проблему, я создал функцию reattachValidation(), которая вызывается всякий раз, когда я добавляю новую строку, чтобы проверка активировала новые строки. Код был изменен:

function reattachValidation() { 
    var forms = $('form'); 
    forms.removeData('validator'); 
    forms.removeData('unobtrusiveValidation'); 

    $.validator.unobtrusive.parse('form'); 
    var form = $('form').get(0); 
    var settings = $.data(form, 'validator').settings; 
    settings.ignore = ':hidden,.blank'; 
} 

Теперь приведенный выше код будет проверять любые новые строки динамически добавленные в таблицу, но будет также проверить пустые строки, которые все еще имеют класс «пустой» на соответствующих элементов. Поэтому я могу либо не проверять пустые строки, ни новые строки ИЛИ я могу проверить все строки, включая те, у которых есть теги с тегами «blank».

Как игнорировать пустые строки, а также проверять новые строки с данными пользователя?

ответ

0

В конце концов я получил эту работу.

В javascript;

$(function() { 
    $.validator.unobtrusive.parse("form"); 
    var form = $("form").get(0); 
    var settings = $.data(form, "validator").settings; 
    settings.ignore = ":hidden,.blank"; 
}); 

// This function will attach any dynamic entity (e.g., a new row in a grid) to the 
// MVC unobtrusive validator to be validated at the appropriate time. 
// Usage: $.validator.unobtrusive.parseDynamicContent(newTableRow); 
(function ($) { 
    $.validator.unobtrusive.parseDynamicContent = function (selector) { 
     //use the normal unobstrusive.parse method 
     $.validator.unobtrusive.parse(selector); 

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

     //get the collections of unobtrusive 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]; 
       //edit:use quoted strings for the name selector 
       $("[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]; 
         //edit:use quoted strings for the name selector 
         $("[name='" + elname + "']").rules("add", args); 
        } 
       }); 
      } 
     }); 
    } 
})($); 

Затем при добавлении новых динамических элементов, это было сделано, как это (анимация не нужна, но вызов parseDynamicContent() есть;

selectedTableRow.after(newTableRow); 
newTableRow.fadeIn(500, function() { 
    // reattach the MVC validation after adding a new row so that we get our client 
    // side validation on the data annotations. 
    // NOTE: we do this AFTER the fade in animation as by default the validator will 
    //  not hook into any hidden elements - which our row is until the animation 
    //  completes. 
    $.validator.unobtrusive.parseDynamicContent(newTableRow); 
}); 
Смежные вопросы