環境:
Windows 2008, VS 2008 SP1, Asp.Net Mvc 1.0
------------------------------------------------------------------------------
一. Asp.Net Mvc中的TempData
在Asp.Net Mvc架構的ControllerBase中存在一個叫做TempData的Property,它的類型為TempDataDictionary,顧名思義是一個字典類。TempData在Asp.Net Mvc中的作用是:可用於在Action執行過程之間傳值。簡單的說,你可以在執行某個Action的時候,將資料存放在TempData中,那麼在下一次Action執行過程中可以使用TempData中的資料。
如:
上面的代碼中,Index()給TempData添加了一個索引值對,假設我們先請求Index這個Action,接著請求Index2這個Action,那麼在Index2中,我們便可以得到之前添加到TempData的索引值對。有趣的是,這時如果再次請求Index2,那麼從TempData中讀到的MyName的值會是null。於是,我們需要瞭解TempData的生命週期。
二. TempData的生命週期
我們知道Http是無狀態的,為什麼TempData可以在兩次請求之前傳遞資料呢?很明顯,這個資料必定是已某種形式儲存了。查看Controller類的原始碼,很容易的找到了我們想要的東西:
從上面的代碼可以看出,每次在執行Action之前,都要調用一下TempData.Load()方法,執行完Action之後,再調用一下TempData.Save()方法。另外這裡還有一個重要成員TempDataProvider。
閱讀了相關原始碼之後,真相大白了。
TempData.Load()
TempData.Save()
TempDataProvider用於暫存資料。在TempData.Load()方法中,TempDataProvider中儲存的資料會被讀到TempData中,供Action調用過程中使用。Action執行完後,TempData.Save()所作的事情則是,移除TempData中任何沒有被更新的索引值對,然後再將TempData中的資料儲存,供下一次調用使用(註:也就是說,只有更新過的,以及新添加的索引值對才能再下次request中繼續使用)。為什麼TempData中的資料需要迅速被清除呢?很簡單,節約記憶體嘛。
三. ITempDataProvider
前面提到的TempDataProvider是Controller的一個Property,它的定義是這樣的:
這裡我們看到了一個預設實現的SessionStateTempDataProvider類。也就是說,預設情況下,Asp.Net Mvc通過SessionStateTempDataProvider來儲存TempData的資料。很明顯,資料是存在Session中的,也就是說,如果你禁用SessionState,那麼你的頁面就報異常了。
Asp.Net Mvc生來就是被設計為易擴充的,我們可以很容易通過實現自己的ITempDataProvider類來替換這個預設的SessionStateTempDataProvider。需要注意的是,TempDataProvider存放的資料必需具有使用者獨立性。
ITempDataProvider介面定義非常簡單:
在MvcFutures中,你也可以找到一個CookieTempDataProvider,提供了將TempData儲存在Cookie中的實現。