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

时间:2010-05-26 19:00:31

标签: asp.net-mvc-2 asp.net-4.0 tempdata

我正在使用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 个答案:

答案 0 :(得分:2)

您应该验证代码中使用TempData["Message"]的所有地方。与ASP.NET MVC does browser refresh make TempData useless?相对应,您只能阅读TempData["Message"]一次(另请参阅http://forums.asp.net/p/1528070/3694325.aspx)。在TempData["Message"]的第一次使用期间,TempData["Message"]将从内部TempDataDictionary中删除。

可能最好只在TempData["Message"]控制器的Revisions操作内使用Page,而不是在母版页内或视图内。

答案 1 :(得分:2)

TempData不是要将数据传递给视图,因此为此目的使用名称ViewData。事实上,我无法想到在视图定义中使用TempData的原因......

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

这是编码MVC交互(Post-Redirect-Get)的PRG方法中的常见做法,因为在执行重定向到Get时,您经常需要从初始目标操作传递信息。在Get中可能有用的示例如下所示我经常默认使用新的viewmodel,除非已经从TempData中的重定向传递了一个:

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

还有一件事;我看到你在视图中明确清除了TempData和ViewData字典条目。你不需要这样做,因为那时他们的生命已经结束......

快乐的编码!

答案 2 :(得分:0)

如果你在使用ViewData的地方使用TempData,你的应用行为就是你所期望的。

当控制器重定向时,您需要仔细检查是否将状态反馈存储在TempData 中。否则,您应该使用ViewData。

答案 3 :(得分:0)

这有点像你需要几个单元测试来确认你所看到的行为。尝试使用此示例编写一对夫妇作为起点:

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

答案 4 :(得分:0)

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

您可以尝试使用MvcFutures CookieTempDataProvider代替。