2011-09-23 50 views
5

我有一个控制器将逻辑查找一个:会话值MVC 3 Session.Abandon()设定的TempData之前称为[“myvalue的”] =“foo”的使下一个控制器具有TempData的为空

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

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

然而在程序编码是;:

然后在控制器I已决定有一个条件,其中在创建TempData [“myobject”] =“foo”之前出现,并且在单步执行代码时,立即窗口中的TempData显示我的值,并且都很好。然后重定向到另一个控制器:

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

此ChildInfo方法不再具有TempData值...现在它为空。会话放弃方法在TempData值被设置之前被调用,并不确定这是否是MVC会话中的错误,但这对我来说意义不大。如果我正在创建一个新的轻量级会话TempData,那么它应该持续到下一个控制器。如果我删除Session.Abandon()方法,那么TempData值会像以前一样继续工作。

+0

这里重要的是TempData依赖于会话。会话消失了,因此TempData消失了。 –

+0

@Adam是的,我意识到无论如何我在创建一个TempData值之前调用Session.Abandon(),但我仍然处于控制器的同一个actionresult方法中,但是,对我而言,这似乎只是一种疯狂。 –

+0

为什么它会疯了?您正在重置tempdata所需的对象。这就像说“我删除表中的所有行,但我不明白为什么在下一个请求中,我要请求的行不在那里?” :) –

回答

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() 

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

+0

谢谢伯尼! –

1

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

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

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

+0

我现在明白了。感谢Guffa。 –

0

这就是它应该如何工作。

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

+0

谢谢!我很欣赏 –