2011-09-23 52 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

謝謝!我很欣賞 –