当用户在我的站点上做以下事情时,我使用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则应该用于重定向。
的问题是:经常不会马上出现消息。有时,只需在站点的不同部分单击一两次,消息就会出现。很奇怪。
有什么想法吗?
发布于 2010-06-28 08:11:00
您应该验证在代码中使用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,而不是在母版页或视图中使用Page。
发布于 2010-06-28 14:56:05
TempData不打算将数据传递给视图,因此为此使用了名称ViewData。事实上,我根本想不出在视图定义中使用TempData的原因.
TempData的一个非常常见的用法是在重定向时在控制器操作之间传递信息(例如,上面示例中的修订操作将能够使用您的TempData["Message"]变量)。
这是PRG编写MVC交互(后-重定向-获取)的方法中的常见做法,因为在对Get进行重定向时,通常需要从初始目标操作传递信息。下面是一个示例,说明这在Get中是如何有用的,我通常只是默认使用一个新的视图模型,除非在TempData中已经从重定向中传递了一个视图模型:
public ActionResult System() {
SystemAdminVM model = (SystemAdminVM)TempData["screenData"] ?? new SystemAdminVM();还有一件事:我看到您在视图中显式地清除了TempData和ViewData字典条目。你不需要这么做,因为他们已经到了生命的尽头.
编码愉快!
发布于 2010-06-21 20:17:11
如果您使用的是TempData,那么应用程序的行为就是应该使用ViewData的行为。
只有当控制器进行重定向时,才需要再次检查是否要将状态反馈存储在TempData中。否则,您应该使用ViewData。
https://stackoverflow.com/questions/2915882
复制相似问题