为什么在MVC的局部视图中没有显示模型错误?

时间:2013-04-26 05:34:17

标签: c# asp.net-mvc asp.net-mvc-4

我正在研究MVC-4应用程序。我在2个不同的控制器中有2个动作,如:

Public ActionResult Detail(int id)
{
  var p = parent.GetById(id);
  ViewBag.Child = TempData["Child"];
  return View(p);
}

Public ActionResult Create(Child child)
{
  if(ModelState.IsValid)
  {
   //code save to db
  }
  TempData["Child"] = child;
  return RedirectToAction("Detail", "Parent", new { id = child.ParentId });
}

我有父视图和部分子视图。子视图在父视图中呈现(子视图包含为父级创建新子项的表单)。当用户添加新子项时,我们将子数据发送到子控制器的创建操作,并且在成功保存后,我们将用户返回到他/她添加子项的同一父项。因此,我们将用户重定向到父控制器的详细操作。如果发生任何验证错误,我们也会重定向到父控制器的详细操作,但这次我们将子对象保存在TempData中以保持模型状态错误。

我的父详情视图是:

.....
......

@if (ViewBag.Child == null)
{
    Html.RenderPartial("_AddChildPartial", new ViewDataDictionary { { "parentId", Model.Id } });
}
else
{
    Html.RenderPartial("_AddChildPartial", ViewBag.Child as xxxx.Models.Child);
}

这里我首先检查viewbag是否包含子对象,如果是,我们将该子对象传递给_AddChildPartial视图。显示模型错误和用户填写表单的数据。数据显示成功,但模型错误不是展示。

有人可以告诉我这里我做错了什么,为什么模型错误现在显示在_AddChildPartial View中?

1 个答案:

答案 0 :(得分:3)

TempData["Child"] = child;

您没有存储完整的模型状态(即验证错误信息) 您只存储Child对象的POST值。

阅读Kazi Manzur Ra​​shid博客文章中的POST REDIRECT GET pattern 它可以轻松解决您的问题。