【问题标题】:keep viewdata on RedirectToAction将视图数据保留在 RedirectToAction 上
【发布时间】:2010-11-16 14:44:46
【问题描述】:
[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 操作中调用该方法,但我觉得必须有更好的方法。

谢谢。

【问题讨论】:

    标签: asp.net-mvc viewdata redirecttoaction


    【解决方案1】:

    您可以使用TempData

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

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

    来自 MSDN:

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

    【讨论】:

    • 有趣,没听说过。 :-)
    • 很遗憾,您也必须在视图中使用“TempData”,并且不能只在那里继续使用 ViewData。但它工作得很好,所以谢谢。
    • 见复制扩展方法blog.eworldui.net/post/2008/06/…
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 我现在正在调查这个。如果您使用 RedirectToAction,数据将必须通过客户端。所以我认为这让我们只剩下“RouteValues”——相当于 QueryString 或 Cookie!
          猜你喜欢
          • 2017-07-04
          • 1970-01-01
          • 1970-01-01
          • 2018-09-21
          • 1970-01-01
          • 2018-03-22
          • 1970-01-01
          • 1970-01-01
          • 2012-08-08
          相关资源
          最近更新 更多