Darin Dimitrov 的答案仅在调用 Ajax 成功处理程序之前未调用 jquery validate plugin 的 validate() 时有效。我想不出可能会出现这种情况的情况,因此我想知道为什么答案被认为是正确的。
也许过去对 jquery 验证代码的更改现在会导致以下问题:
问题是validate()首先执行以下行
// Check if a validator for this form was already created
var validator = $.data( this[ 0 ], "validator" );
if ( validator ) {
return validator;
这意味着当调用 validate() 时返回 validator 对象,并且没有传递选项的进一步处理。
这也意味着稍后对 $.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 属性变得无用。