ValidationMessageFor不呈现错误消息

时间:2013-02-08 21:52:09

标签: jquery asp.net-mvc asp.net-mvc-4 jquery-validate unobtrusive-validation

我有一个部分视图:

 @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
                }); 

并且元素是我的文本框,表单是View表单,消息是“BM必须是数字”。所以一切对我来说都很好。

但是猜猜看......验证错误信息仍然没有出现!

任何jquery guru在那里帮忙吗? :)

1 个答案:

答案 0 :(得分:-1)

我也对此问题进行了大量研究,发现对我有帮助: 只需添加 $(“#myForm”)。valid(); 与:

<script src='@Url.Content("~/Scripts/jquery.validate.js")' type='text/javascript'></script>
<script src='@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")' type='text/javascript'></script>