我有一个部分观点:
@Html.EditorFor(model => model.BM)
@Html.ValidationMessageFor(model => model.BM)
在主视图中,如果我这样做:
@using (Html.BeginForm())
{
@Html.Partial("QuoteStep1", Model)
}
然后调用 $('form').validate() 验证表单,如果我不填写数据,则会显示错误消息。
但是,如果我改为使用 AJAX 调用加载部分视图,则调用 $('form').validate() 仍然有效(它正确返回 true 或 false)但不再显示错误消息!
我在某处读到我应该将以下内容添加到部分视图的顶部:
@if (this.ViewContext.FormContext == null)
{
this.ViewContext.FormContext = new FormContext();
}
但它根本没有任何影响。
[编辑:我的研究更新]
经过2个多小时的调试,我发现了一些东西。首先,因为我使用 AJAX 请求加载表单的内容,所以新添加的 HTML 控件不是 DOM 的一部分。因此,jquery 验证器无法知道这些控件。
因此,在 AJAX 成功回调中添加以下代码行应该可以解决问题:
$.validator.unobtrusive.parse($('form'));
这是在将 AJAX 结果添加到 DOM 之后立即设置的。
当我进一步调试验证器时,我可以看到该代码被调用:
$(selector).find(":input[data-val=true]").each(function () {
$jQval.unobtrusive.parseElement(this, true);
});
意思是,它找到了新添加的输入框。
在 $jQval.unobtrusive.parseElement 方法中,以下代码被命中:
this.adapt({
element: element,
form: form,
message: message,
params: paramValues,
rules: rules,
messages: messages
});
元素是我的文本框,表单是查看表单,消息是“BM 必须是数字”。所以在我看来一切都很好。
但是你猜怎么着......验证错误消息仍然没有出现!
有任何 jquery 大师可以帮忙吗?:)