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

Tom*_*kel 5 asp.net-mvc asp.net-mvc-routing asp.net-mvc-3

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

 //checks value null etc..  for existing record in session memory.
 Session["certnum"]  
Run Code Online (Sandbox Code Playgroud)

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

 //is called to initiate a New Record that will be created.
 Session.Abandon();
Run Code Online (Sandbox Code Playgroud)

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

return RedirectToAction("ChildInfo", "NewRecord");  
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*ite 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);
Run Code Online (Sandbox Code Playgroud)

要么

Session.RemoveAll()
Run Code Online (Sandbox Code Playgroud)

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