Существует большая проблема с решением Nickz, из-за которой я вырывал свои волосы, пока не нашел другой обходной путь.
// forces creation of a new validator, which in turn causes
// an extra submit event handler to be attached!!!
$("form").removeData("validator");
$("form").removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse("form");
Когда вы делаете это, каждый раз, когда вы вызываете $.validator.unobtrusive.parse()
, новый обработчик события будет присоединен к событию отправки формы, оставляя старый обработчик события без изменений. Это означает, что когда вы запускаете приведенный выше код несколько раз, валидатор будет без необходимости запускаться несколько раз при запуске события submit. Это вызвало серьезные проблемы с производительностью для меня. В итоге я написал собственную альтернативу методу parse()
, который назвал updateParse
:
$.extend($.validator.unobtrusive, {
updateParse: function (selector) {
/// <summary>
/// Custom alternative for the built in method $.validator.unobtrusive.parse() which can updates an existing validator.
/// Use this only when a validator has not yet been initialized, i.e. when $.validator.unobtrusive.parse()
/// has not yet been called before.
/// This is intended for use after you dynamically add / remove / modify validatable elements to a form via AJAX.
/// 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>
/// <param name="selector" type="String">Any valid jQuery selector.</param>
var $forms = $(selector)
.parents("form")
.andSelf()
.add($(selector).find("form"))
.filter("form");
$(selector).find(":input[data-val=true]").each(function () {
$.validator.unobtrusive.parseElement(this, true);
});
$forms.each(function () {
var form = $(this);
var info = form.data("unobtrusiveValidation");
if (info) {
var validator = form.data("validator");
if (validator) {
validator.settings.rules = info.options.rules;
}
else {
throw "validator not yet initialized for this form yet -- use $.validator.unobtrusive.parse() instead";
}
}
});
}
Это обновит правила валидации существующего объекта валидатора, вместо того, чтобы форсировать создание нового валидатора при добавлении дополнительного обработчика события submit.
В моем варианте метод parse()
должен работать только тогда, когда валидатор уже существует.