在设置TempData [“myvalue”] =“foo”之前调用MVC 3 Session.Abandon()会导致下一个控制器将TempData设为null

时间:2011-09-23 22:36:02

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

我有一个控制器将逻辑查找:会话值

 //checks value null etc..  for existing record in session memory.
 Session["certnum"]  

然后在控制器中我决定有一个条件:

 //is called to initiate a New Record that will be created.
 Session.Abandon();

然而在程序编码中是Session.Abandon();在创建TempData [“myobject”] =“foo”之前,在单步执行代码时,立即窗口中的TempData显示我的值,一切看起来都很好。然后在重定向到另一个控制器时:

return RedirectToAction("ChildInfo", "NewRecord");  

此ChildInfo方法不再具有TempData值...现在它为null。在设置TempData值之前调用了Session Abandon方法,不确定这是否是MVC Sessions的错误,但这对我来说毫无意义。如果我正在创建一个新的轻量级会话TempData,那么它应该持久保存到下一个控制器。如果我删除Session.Abandon()方法,那么TempData值将保持原样,就像之前一样。

3 个答案:

答案 0 :(得分:11)

Session.Abandon()方法会在请求结束时清除当前会话,以及它的设计目标。

请参阅http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.abandon.aspx

如果要重定向到其他操作,则需要像完成一样调用重定向。如果您使用Abandon(),请求将获得新的会话ID。

如果您想从会话中删除某些内容,则需要使用Session.RemoveSession.RemoveAll方法(Clear也可以与RemoveAll相同。这将通过以下方式完成:

Session.Remove(itemToRemove);

Session.RemoveAll()

通过使用这两个选项中的任何一个,您可以从会话中删除部分或全部先前存储的数据,而不会实际导致在下一个请求中重新生成会话ID。

答案 1 :(得分:1)

Session.Abandon方法不会清除会话对象,它只标记不应该保留它。在当前请求期间,会话对象仍然完好无损。

当响应完成时,会话对象被放弃,以便下次浏览器发出请求时,服务器必须设置新的会话对象。在会话对象被放弃时,您在整个请求期间放入会话对象的任何内容都会消失。

当您进行重定向时,会将重定向页面作为响应发送到浏览器,然后浏览器会请求新页面。如果您将会话对象标记为要放弃,然后执行重定向,则新页面将获取新的会话对象。

答案 2 :(得分:0)

这就是它应该如何运作。

Session.Abandon不会立即终止会话。它持续到页面结束。然后,在下一页加载时,将创建一个新会话。