代码之家  ›  专栏  ›  技术社区  ›  shsteimer

TempData[“message”]不可靠-我做错了什么?

  •  3
  • shsteimer  · 技术社区  · 14 年前

    我在用 TempDate["Message"] 要在用户在我的网站上执行以下操作时显示小更新横幅:

    [AcceptVerbs(HttpVerbs.Post), Authorize(Roles = "Admins")]
    public ActionResult Delete(int id)
    {
        _Repo.DeletePage(id); // soft-delete
    
        TempData["Message"] = "Page deleted!";
        return RedirectToAction("Revisions", "Page", new { id = id });
    }
    

    <%-- message box (show it only if it contains a message) --%>
    <% string Message = (TempData["Message"] ?? ViewData["Message"]) as string; 
    
       if(!string.IsNullOrEmpty(Message)){
           %>
           <div id="message"><%:Message %></div>
       <% }
    
       TempData["Message"] = null; ViewData["Message"] = null; %>
    

    我同时点击TempData和ViewData是因为我在某个地方读到TempData应该用于重定向,而ViewData应该用于其他用途。

    5 回复  |  直到 14 年前
        1
  •  2
  •   Community CDub    7 年前

    你应该核实你使用的所有地方 TempData["Message"] ASP.NET MVC does browser refresh make TempData useless? 你可以阅读 TempData[“消息”] 只有一次(另见 http://forums.asp.net/p/1528070/3694325.aspx ). 在第一次演讲中 ,的 TempData[“消息”] TempDataDictionary .

    也许用它会更好 只在内部 Revisions Page 控制器,而不是在母版页或视图中。

        2
  •  2
  •   Tahbaza    14 年前

    TempData的一个非常常见的用法是在执行重定向时在控制器操作之间传递信息(例如,上面示例中的Revisions操作将能够利用 TempData["Message"] 变量)。

    public ActionResult System() {
       SystemAdminVM model = (SystemAdminVM)TempData["screenData"] ?? new SystemAdminVM();
    

    还有一件事;我看到您在视图中显式清除TempData和ViewData字典条目。你不需要这么做,因为到那时他们已经到了生命的尽头。。。

    快乐的编码!

        3
  •  0
  •   Larry K    14 年前

    如果您使用的是TempData,而您应该使用ViewData,那么应用程序的行为就是您所期望的。

    只有 当控制器重新定向时。否则,应使用ViewData。

        4
  •  0
  •   a7drew    14 年前

    这听起来像是你需要一些单元测试来确认你看到的行为。试着用这个例子作为起点来写几个:

    http://weblogs.asp.net/leftslipper/archive/2008/04/13/mvc-unit-testing-controller-actions-that-use-tempdata.aspx

        5
  •  0
  •   Community CDub    7 年前

    如果已经为应用程序配置了多个工作进程,但会话状态模式为“InProc”,则不能使用默认的TempData实现,因为会话状态变得不可用(看见 ASP.NET session state and multiple worker processes )

    你可以尝试使用MVC未来 CookieTempDataProvider