ASP.NET MVC 2 JQuery POST不显示模型状态错误

时间:2010-03-29 03:31:37

标签: asp.net-mvc-2-validation

我一直在使用asp.net mvc(但我仍然是一个初学者)。我希望能够更新两个视图作为jquery回发的结果。

基本上我有一个列表和详细信息视图。使用jquery弹出窗口(使用jquery-UI弹出窗口)显示详细信息视图。如果详细信息保存成功,我只想更新列表(即详细信息视图中没有验证错误)。但是,如果详细信息视图中有任何验证错误,我想更新详细信息视图,以便用户看到验证错误。

所以我想在我的控制器中,我返回一个JsonResult而不是View。

[HttpPost]
public ActionResult SavePersonInfo(Person p) {
    if(ModelState.Valid) {
        return View("PersonList");
    }

    return Json({Error = true, View = PartialView("PersonDetails", p)});
}

如您所见,如果没有错误,我会返回人员列表视图,但如果有任何验证错误,我会返回详细信息视图。我返回JsonResult的原因是我需要告诉我的视图有一个错误,以便视图(jquery)知道要更新哪个部分(如更新人员列表'div'或弹出对话框'div “)。

所以,在我看来,jquery如下(请假设有一个用于输入人员详细信息的表单,并且“SubmitPersonForm();”函数在单击“保存”按钮时被调用):

<script type="text/javascript>
    $('#btnSave').click(function (event) {
            onBegin();

            $.ajax(
            {
                type: "POST",
                url: "/Person/Save",
                data: $('form').serialize(),
                success: function (result) {
                 if(result.Error) {
                        $('#dvDetails').html($(result).View));
                    }
                    else {
                        $('#dvPersonList').html($result);
                    }  
                }
            });
        });
</script>

所以我现在遇到的问题是,当出现验证错误时,我确实看到正确的'div'正在更新,但我丢失了asp.net mvc验证消息。我没有看到任何红色验证错误,好像ASP.NET MVC完全被忽略了。但是,我的ModelState确实有那些错误,只是没有显示在详细信息视图中。我确实在我的详细信息视图中放置了验证摘要和Html.ValidationFor(m =&gt; ...)语句。

有人能告诉我为什么我没有看到验证错误吗?虽然我正在使用JSonResult,但我在使用'dvDetails'时使用了正确的属性,这是一个有效的视图。我在asp.net mvc做了一些我不认为的事情吗?顺便说一句,我正在使用asp.net mvc2 RC和Visual Studio 2010 RC。

谢谢。

2 个答案:

答案 0 :(得分:0)

Url与Action名称不匹配...不确定您是否在控制器上调用错误的方法...只是一个想法。 : - )

答案 1 :(得分:0)

ASP.NET MVC代码处理响应以在回发期间显示存储在ModelState中的验证错误。因为您使用的是Ajax Post,所以回发代码不会重建页面并显示验证错误。如果要显示验证错误,则必须自己处理。

我是通过将ModelState错误作为响应中的数组传递来完成的。我处理我的Ajax响应以更新表单中的验证错误占位符元素,并在响应中显示相应的错误消息。

虽然出现警告:ModelState中的键可能会更改其大小写,因此表单中的元素ID字符串与用于键的字符串不完全匹配。 ModelStateDictionary不区分大小写,但DOM ID不是。