Следующие выводы могут быть интересны, чтобы понять разницу между:
submitHandler : вызывается при успешной проверке формы - прямо перед отправкой на сервер
invalidHandler : вызывается, если проверка не пройдена и сообщения не возвращаются
@ Решение DGreen определенно является наилучшим способом внедрения специальной обработки, если проверка формы не удалась и вам нужно что-то сделать, например, отобразить всплывающую сводку проверки ( invalidHandler )
$("form").bind("invalid-form.validate", function () {
alert('invalid!');
});
@ Решение PeteHaus - лучший способ сделать что-то, если вы хотите предотвратить обратную передачу успешно проверенной формы ( submitHandler )
$("form").data("validator").settings.submitHandler = function (form) {
alert('submit'); form.submit(); };
Однако меня немного беспокоило, какое поведение я переопределял (или не переопределял), привязываясь к методу .validate
, как этот, - и почему мне приходилось делать каждый путь по-разному. Поэтому я проверил источник. Я настоятельно рекомендую всем, кто хочет разобраться в этой процедуре, сделать то же самое - добавить несколько «предупреждений» или «отладчиков», и за ним довольно легко следовать *
В любом случае получается, что когда обработчик jquery.validate.unobtrusive
инициализирует плагин jquery.validate
, он делает это в методе parseElement()
, извлекая параметры, созданные методом validationInfo()
.
ValidationInfo()
возвращает следующие параметры:
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)
},
Метод onErrors()
в jquery.validate.unobtrusive
отвечает за динамическое создание сводной панели проверки для MVC. Если вы не создаете панель сводки проверки (с @Html.ValidationSummary()
, которая должна случайно содержаться в теле FORM), тогда этот метод полностью инертен и ничего не делает, так что вам не о чем беспокоиться.
function onErrors(event, validator) { // 'this' is the form elementz
var container = $(this).find("[data-valmsg-summary=true]"),
list = container.find("ul");
if (list && list.length && validator.errorList.length) {
list.empty();
container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
$.each(validator.errorList, function () {
$("<li />").html(this.message).appendTo(list);
});
}
}
Если вы действительно хотите, вы можете отсоединить обработчик jquery.validate.unobtrusive
вот так - но я бы не стал беспокоиться
$("form").unbind("invalid-form.validate"); // unbind default MS handler
Если вам интересно, почему это работает
$("form").data("validator").settings.submitHandler = ...
и это не работает
$("form").data("validator").settings.invalidHandler = ...
это потому, что submitHandler
явно вызывается внутри jquery.validate
, когда выполняется проверка. Поэтому не имеет значения, в какой точке он установлен.
validator.settings.submitHandler.call( validator, validator.currentForm );
но invalidHandler
связан с событием во время init()
, как это, поэтому, если вы установите его в своем собственном коде, будет слишком поздно
if (this.settings.invalidHandler)
$(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
Небольшое пошаговое выполнение кода иногда очень полезно для понимания! Надеюсь, это поможет
* Убедитесь, что у вас не включена минификация в связках.