在RedirectToAction上保留viewdata

时间:2009-08-04 08:37:05

标签: asp.net-mvc viewdata redirecttoaction

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreateUser([Bind(Exclude = "Id")] User user)
{
        ...
        db.SubmitChanges();
        ViewData["info"] = "The account has been created.";
        return RedirectToAction("Index", "Admin");
}

这不会在redirectToAction之后的viewdata中保留“info”文本。 我将如何以最优雅的方式解决这个问题?

我目前的想法是将Index controlleraction中的东西放在[NonAction]中并从Index操作和CreateUser操作中调用该方法,但我觉得必须有更好的方法。

感谢。

5 个答案:

答案 0 :(得分:71)

您可以使用TempData

TempData["info"] = "The account has been created."

TempData完全适用于这种情况。它使用Session作为存储,但在第二次响应后它不会出现。

来自MSDN:

  

TempDataDictionary对象的典型用法是在重定向到另一个操作方法时从操作方法传递数据。例如,action方法可能会在调用RedirectToAction方法之前在控制器的TempData属性(返回TempDataDictionary对象)中存储有关错误的信息。然后,下一个操作方法可以处理错误并呈现显示错误消息的视图。

答案 1 :(得分:12)

如果您的数据在“此”请求期间可以在ViewData中访问,请使用View。如果您的数据用于“下一个”请求,请使用“TempData”(例如POST-REDIRECT-GET design pattern)。

答案 2 :(得分:2)

如果你不止一次需要这个,一个很好的解决方法是创建ActionFilterAttributes,它将tempdata导出/导入到viewdata,反之亦然。你也可以很好地传递你的ModelState(演示here - #13)。 通过对这段代码进行一些调整,我认为你会有一个干净的解决方案。

答案 3 :(得分:2)

您可以使用TempData控制器属性,但它的缺点是它在后台使用会话存储。这意味着您将有额外的工作使其在Web场上运行,并且您首先需要在应用程序中启用会话。

如果您只需要传输短信,则可以选择使用Cookie。这确实需要对cookie进行适当的加密。不依赖于TempData属性还允许您在非MVC上下文中设置消息,例如在经典的ASHX页面中。

看看FlashMessage,这可以为您节省一些自己实现的工作。

答案 4 :(得分:1)

由于TempData似乎使用存储,并且任何形式的ITempDataProvider都不是" in-process",要求该对象是Serializable,TempData在网络服务器场的情况下似乎非常不合适......(ViewDataDictionary isn& #39; t本身可序列化...)有人对此有任何建议吗?