Ответ Дарина Димитрова работает только тогда, когда validate()
из jquery validate plugin
не вызывается до тех пор, пока не будет вызван обработчик успеха Ajax. Я не могу придумать сценарий, в котором это может иметь место, поэтому мне интересно, почему ответ был принят как правильный.
Возможно, изменение кода проверки jquery в прошлом теперь вызывает следующую проблему:
Проблема в том, что validate()
сначала выполняет следующую строку
// Check if a validator for this form was already created
var validator = $.data( this[ 0 ], "validator" );
if ( validator ) {
return validator;
, что означает, что объект валидатора возвращается при вызове validate () без дальнейшей обработки параметров, переданных .
Это также означает, что более поздний вызов $.validator.unobtrusive.parse(...)
или $.validator.unobtrusive.parseElement(...)
, который выполняет
$form.validate(this.options) <- this.options holds the new rules parsed from HTML
Обновление параметров валидатора не имеет никакого эффекта, поскольку опции не обрабатываются вообще.
Решением здесь является обновление валидатора вручную, например
var $htmlCode = $("your html");
$.validator.unobtrusive.parse($htmlCode, true); // true means no validate() call
// now get the validation info collected in parse()
var validationInfo = $form.data("unobtrusiveValidation");
var $validator = $form.validate(); // get validator and ...
$validator.settings.rules = validationInfo.options.rules; // ... update its rules
$validator.settings.messages = validationInfo.options.messages; // ... update its messages
Повторная проверка формы (например, нажав «Отправить») теперь должна привести к ожидаемым результатам.
Вот полный пример, в который также входит код из уже принятого ответа:
Бритва
@using (Ajax.BeginForm(
"Action1",
"Controller",
null,
new AjaxOptions {
OnSuccess = "onSuccess",
UpdateTargetId = "result"
},
null)
)
{
<input type="submit" value="Save" />
}
Javascript
var onSuccess = function(result) {
var $htmlCode = $(result);
$.validator.unobtrusive.parse($htmlCode, true); // true means no validate() call
// now get the validation info collected in parse()
var validationInfo = $form.data("unobtrusiveValidation");
var $validator = $form.validate(); // get validator and ...
$validator.settings.rules = validationInfo.options.rules; // ... update its rules
$validator.settings.messages = validationInfo.options.messages; // ... update its messages
};
-
В качестве примечания, ручное обновление валидатора также возможно при использовании метода rules()
, например
$yourHtmlField.rules( "add", {
required: true,
messages: {
required: "Required input"
}
});
, так как это напрямую обновляет правила валидатора без ненавязчивых вещей. Но тогда атрибуты data-val становятся бесполезными.