43
[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 之后,这不会在视图数据中保留“信息”文本。我将如何以最优雅的方式解决这个问题?

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

谢谢。

4

5 回答 5

89

您可以使用TempData.

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

TempData正是针对这种情况而存在的。它使用 Session 作为存储,但在第二次响应后它不会出现。

来自 MSDN:

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

于 2009-08-04T08:52:42.710 回答
13

ViewData如果您的数据应该View在“此”请求期间可访问,则使用此选项。如果您的数据用于“下一个”请求(例如POST-REDIRECT-GET 设计模式),请使用 `TempData'。

于 2009-08-04T09:00:17.593 回答
2

如果您不止一次需要这个,一个很好的解决方法是创建 ActionFilterAttributes,它将临时数据导出/导入到 viewdata,反之亦然。您也可以通过这种方式很好地传递您的 ModelState(在此处演示- #13)。我认为,通过对那段代码进行一些调整,您将获得一个干净的解决方案。

于 2009-10-26T14:52:48.910 回答
2

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

如果您只需要传输一条短消息,另一种方法是使用 cookie。这确实需要对 cookie 进行适当的加密。不依赖该TempData属性还允许您在非 MVC 上下文中设置消息,例如在经典 ASHX 页面中。

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

于 2015-09-30T07:10:24.577 回答
1

由于 TempData 似乎使用存储,并且任何形式的非“进程中”的 ITempDataProvider 都要求对象可序列化,因此 TempData 在网络场情况下似乎严重不足......(ViewDataDictionary 本身不是可序列化的......)有人对此有什么建议吗?

于 2014-06-24T18:30:38.250 回答