public ActionResult Index()
{
TempData["msg"] = "Test";
return RedirectToAction("About");
}
public ActionResult About()
{
var msg = TempData["msg"];
return View();
}
一个简单的问题。我确信当我看到它的答案时,我会拍我的额头。
导航到浏览器中的“索引”操作会导致重定向到“关于”操作,并且TempData值正确。
为什么当我使用Fiddler编辑器导航到Index操作时,它会导致重定向到About操作,但TempData值会丢失并且为null?
答案 0 :(得分:1)
我认为答案可以在这里找到(http://msdn.microsoft.com/en-us/library/ms178581(v=vs.100).aspx):
“会话由唯一标识符标识,可以使用SessionID属性读取。当为ASP.NET应用程序启用会话状态时,将检查应用程序中页面的每个请求是否有从此发送的SessionID值。如果没有提供SessionID值,ASP.NET将启动一个新会话,该会话的SessionID值将通过响应发送到浏览器。“
当我将此行添加到每个操作的开头时:
Debug.Write(string.Format("SessionId: {0}\r\n", HttpContext.Session.SessionID));
我看到当你从浏览器运行时,sessionid是相同的。从Fiddler作曲家开始,他们是不同的。
因此,将使用默认的TempDataProvider(将TempData存储在会话状态中)重置TempData。
答案 1 :(得分:0)
如果请求相同,则结果应相同。很可能你在编写假的时候没有制作第一个请求的精确副本。请注意,对于tempData,只有当第一个请求包含此数据时,您的组合请求才会起作用(获取tempData) - 因此您必须对应用程序尚未发送的请求进行“复制”,您无法重放依赖于tempData。
临时数据存储在会话状态中并在第一次请求后被清除,因此如果你没有正确地发送信息,那么它将无效/丢失信息手/通过Fiddler作曲家或(如你的情况)制作第二向同一个控制器请求相同的信息。
另请参阅同一主题的其他related questions。