代码之家  ›  专栏  ›  技术社区  ›  Thomas Stock

将viewdata保留在RedirectToAction上

  •  33
  • Thomas Stock  · 技术社区  · 17 年前
    [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中保留“信息”文本。 我怎样才能以最优雅的方式解决这个问题?

    谢谢

    5 回复  |  直到 17 年前
        1
  •  88
  •   p.campbell    16 年前

    TempData

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

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

    从MSDN:

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

        2
  •  13
  •   eu-ge-ne    17 年前

    使用 ViewData View POST-REDIRECT-GET design pattern ).

        3
  •  2
  •   Leon    16 年前

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

        4
  •  2
  •   Christ A    10 年前

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

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

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

        5
  •  1
  •   Novox    12 年前

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

    推荐文章