- PVSM.RU - https://www.pvsm.ru -
Это 3 часть серии «Понимание ненавязчивой валидации в ASP.Net MVC».
О чем мы поговорим в этой статье:
Мы объясним цикл ненавязчивой валидации, который происходит, когда документ загружается, и поймем роль каждого компонента.
Если мы посмотрим в конец jquery.validate.unobtrusive.js мы найдем
$(function () {
$jQval.unobtrusive.parse(document);
});
Итак, мы вызываем метод «parse()» и передаем ему «document»
Что представляет собой метод «parse()»?
{
parse: function (selector) {
///
<summary>
/// Parses all the HTML elements in the specified selector. It looks for input elements decorated
/// with the [data-val=true] attribute value and enables validation according to the data-val-*
/// attribute values.
/// </summary>
///Any valid jQuery selector.
$(selector).find(":input[data-val=true]").each(function () {
$jQval.unobtrusive.parseElement(this, true);
});
var $forms = $(selector)
.parents("form")
.andSelf()
.add($(selector).find("form"))
.filter("form");
$forms.each(function () {
var info = validationInfo(this);
if (info) {
info.attachValidation();
}
});
}
}
У метода «parse()» есть две секции
parseElement(element, skipAttach)
$(selector).find(":input[data-val=true]").each(function () {
$jQval.unobtrusive.parseElement(this, true);
});
Первое, что происходит, это мы проходим циклом по всем элементам содержащим «data-val=true» внутри селектора, который мы передаем (в нашем случае это «document»)
Затем вызываем «parseElement()» и передаем ему элемент, который мы хотим провалидировать и «true» для «skipAttach».
Может возникнуть вопрос, почему мы передаем true, а не false в «skipAttach».
«skipAttach» — это флаг, для вызова «validate()» на форме.
Если мы передаем «false», к элементу, который мы передаем, прикрепляются правила валидации и сразу же вызывается метод «validate» для массива правил и передаются дальше другие опции, необходимые для ненавязчивой валидации(Если есть какой-либо другой элемент, который они собираются парсить).
Мы не хотим этого. В первую очередь, мы хотим прикрепить правила к каждому элементу формы, и затем, когда все правила будут прикреплены, мы вызовем «validate()», основной во второй части метода «parse».
В каких случаях нам необходимо передать «true» в «skipAttach»?
Если мы хотим добавить динамический элемент в форму, которая уже была провалидирована, мы передадим «true», чтобы не проводить валидацию формы снова, так как не хотим чтобы что-то происходило(мы поговорим о динамической валидации элемента в следующей статье)
В основном функция «parseElement()» выполняет две вещи:
1. Когда первый раз вызывается элемент формы(ни один элемент не вызывался до этого в этой форме), функция конструирует объект опций, которые будут переданы методу «validate()». Опции используются jquery.unobtrusive как отдельная функция «errorPlacement», отдельный «errorClass» и как пустой массив правил.
Заметка: это все можно сделать в приватном методе «validationInfo(form)», который вызывается без «parseElement», и, когда он вызывается больше, чем 1 раз, он просто возвращает тот же объект. Таким образом, мы можем добавлять, изменять или вызывать в нем данные/функции.
2. Для каждого элемента, когда мы вызываем «parseElement», он понимает правила, которые записаны в этом элементе («the data-*»), используя адаптеры (дальше есть пункт с объяснением, как работают адаптеры), и затем переводит и добавляет их к массиву правил, который был создан при первом вызове.
Заметка: При каждом обращении к «parseElement», его результат будет сохранен в форме, используя метод $.data(“unobtrusiveValidation“). Таким образом, отдельные вызовы синхронизируются с одним и тем же источником данных.
var $forms = $(selector)
.parents("form")
.andSelf()
.add($(selector).find("form"))
.filter("form");
$forms.each(function () {
var info = validationInfo(this);
if (info) {
info.attachValidation();
}
});
Мы уже упоминали, что вызов функции «validateInfo()» конструирует объект опций метода «validate()». Опции используются jquery.unobtrusive как отдельная функция «errorPlacement», отдельный «errorClass» и пустой массив правил.
Тут мы вызываем также «validateInfo()» для каждой формы на странице. Обычно, вызывая в этом месте «valaidateInfo», мы только получаем объект, сохраненный в форме, который был уже заполнен в первой фазе. То есть мы используем ее как «getter».
Затем мы вызываем «attachValidation()», который вызывает метод «validate()», передавая ему опции, заполненные вызовом «validationInfo()».
data_validation = "unobtrusiveValidation";
function validationInfo(form) {
var $form = $(form),
result = $form.data(data_validation),
onResetProxy = $.proxy(onReset, form);
if (!result) {
result = {
options: { // options structure passed to jQuery Validate's validate() method
errorClass: "input-validation-error",
errorElement: "span",
errorPlacement: $.proxy(onError, form),
invalidHandler: $.proxy(onErrors, form),
messages: {},
rules: {},
success: $.proxy(onSuccess, form)
},
attachValidation: function () {
$form
.unbind("reset." + data_validation, onResetProxy)
.bind("reset." + data_validation, onResetProxy)
.validate(this.options);
},
validate: function () { // a validation function that is called by unobtrusive Ajax
$form.validate();
return $form.valid();
}
};
$form.data(data_validation, result);
}
return result;
}
Сперва мы проверяем, не вызывали ли мы уже эту функцию на форме раньше, используя $form.data(“unobtrusiveValidation“). Если уже вызывали, тогда мы ничего не делаем и возвращаем результат.
Если это первый вызов функции «validationInfo()», то мы создаем объект результата и сохраняем его на форме используя метод $.data(). Этот объект содержит 3 части:
function onReset(event) { // 'this' is the form element
var $form = $(this);
$form.data("validator").resetForm();
$form.find(".control-group").removeClass("error");
$form.find(".validation-summary-errors")
.addClass("validation-summary-valid")
.removeClass("validation-summary-errors");
$form.find(".field-validation-error")
.addClass("field-validation-valid")
.removeClass("field-validation-error")
.removeData("unobtrusiveContainer")
.find(">*") // If we were using valmsg-replace, get the underlying error
.removeData("unobtrusiveContainer");
Итак, если мы хотим вызвать событие «reset», чтобы обнулить валидацию формы:
$('form').trigger('reset.unobtrusiveValidation')
Я специально пропустил тему адаптеров, когда говорил о методе «parseElement()», потому что они достаточно сложные, чтобы выделить для них подпункт.
Мы посмотрели как генерируется Html с помощью ненавязчивой валидации, и как добавлять отдельные атрибуты валидации в нормальной jquery.validate. Чтобы связать эти две части используются адаптеры.
Итак, за что отвечают адаптеры?
Адаптеры отвечают за то, чтобы перевести Html «data-*» в формат, понятный обычному плагину jquery.validate. Если пользователь хочет добавить отдельный метод валидации с помощью ненавязчивой валидации, он должен также создать адаптер для нее. Коллекция адаптеров находится в $.validator.unobtrusive.adapters. Коллекция адаптеров состоит из всех адаптеров по умолчанию, которые определены в jquery.unobstrusive, и тех, которые определены пользователем.
Она также содержит 4 метода для добавления собственного адаптера, на которые мы посмотрим позже.
Самый основной метод:
jQuery.validator.unobtrusive.adapters.add(adapterName, [params], fn)
Мы можем считать этот метод методом $.ajax, три другие метода вспомогательные, используют этот метод.
Давайте разберем параметры:
Пример:
Html
<input id="val" type="text" name="val" data-val="true" data-val-between="Must be in the right range" data-val-between-min="5" data-val-between-max="30" />
JavaScript
//The adapter
jQuery.validator.unobtrusive.adapters.add(
'between', ['min' ,'max'], function (options) {
options.rules['between'] = {
min: options.params.min,
max: options.params.max
};
options.messages['between'] = options.message;
}
);
//The validation method
jQuery.validator.addMethod("between", function (value, element, params) {
params.min == 5; //true
params.max == 30; //true
});
Что же насчет других адаптеров:
addBool
addSingleVal
addMinMax
Они достаточно простые, если вы поймете концепцию добавления собственного адаптера используя метод «add()», объясненный ранее.
Также вы можете посмотреть статью Brad Wilson «Unobtrusive Client Validation in ASP.NET MVC 3» [1], где он объясняет тему адаптеров более подробно.
Перевод статьи Nadeem Khedr How the unobtrusive jQuery validate plugin works internally in Asp.net MVC [2]
Автор: Juty
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/35690
Ссылки в тексте:
[1] Brad Wilson «Unobtrusive Client Validation in ASP.NET MVC 3»: http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html
[2] How the unobtrusive jQuery validate plugin works internally in Asp.net MVC : http://nadeemkhedr.wordpress.com/2012/08/27/how-the-unobtrusive-jquery-validate-plugin-works-internally-in-asp-net-mvc/
[3] Источник: http://habrahabr.ru/post/181758/
Нажмите здесь для печати.