3

当用户在我的网站上做这样的事情时,我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 应该用于其他情况。

问题是:消息通常不会立即显示。有时需要单击或两次单击站点的不同部分才能显示消息。这很奇怪。

有任何想法吗?

4

5 回答 5

2

TempData["Message"]您应该验证您在代码中使用的所有位置。对应于ASP.NET MVC 浏览器刷新是否使 TempData 无用?您只能阅读TempData["Message"]一次(另请参阅http://forums.asp.net/p/1528070/3694325.aspx)。在第一次使用期间TempData["Message"]TempData["Message"]将从内部删除TempDataDictionary

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

于 2010-06-28T08:11:00.460 回答
2

TempData 不打算将数据传递给视图,因此为此目的命名为 ViewData。事实上,我根本想不出在视图定义中使用 TempData 的理由......

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

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

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

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

快乐编码!

于 2010-06-28T14:56:05.583 回答
0

Your app's behavior is the one you'd expect if you're using TempData where you should be using ViewData.

You want to double-check that you're storing your status feedbacks in TempData only when the controller does a re-direct. Otherwise, you should use ViewData.

于 2010-06-21T20:17:11.770 回答
0

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

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

于 2010-06-29T23:31:13.290 回答
0

如果您为您的应用程序配置了多个工作进程,但会话状态模式是“InProc”,那么您不能使用默认的 TempData 实现,因为会话状态变得不可用。(请参阅ASP.NET 会话状态和多个工作进程

您可以尝试改用 MvcFutures CookieTempDataProvider

于 2010-08-13T13:31:37.593 回答