0

我一直在使用 asp.net mvc (但我还是个初学者)。由于 jquery 回发,我希望能够更新两个视图。

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

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

[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 => ...) 语句。

有人可以告诉我为什么我没有看到验证错误吗?虽然我使用的是 JSonResult,但在渲染“dvDetails”时,我确实使用了正确的属性,这是一个有效的视图。我在做一些我不应该在 asp.net mvc 中做的事情吗?顺便说一句,我将 asp.net mvc2 RC 与 Visual Studio 2010 RC 一起使用。

谢谢你。

4

2 回答 2

0

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

于 2010-03-31T19:15:07.747 回答
0

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

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

但是有一个警告:ModelState 中的键的大小写可能发生了变化,因此表单中的元素 ID 字符串与用于键的字符串不完全匹配。ModelStateDictionary 不区分大小写,但 DOM ID 不区分大小写。

于 2011-09-12T14:45:41.400 回答