另一篇文章,也對TempData 做了很詳細的介紹,鏈接地址:https://www.jianshu.com/p/eb7a301bc536 。 MVC中的 TempData 可以在Controller之間進行傳遞,如果使用過了之後,不管是在View里使用,還是在controller里使用,再次獲取就 ...
另一篇文章,也對TempData 做了很詳細的介紹,鏈接地址:https://www.jianshu.com/p/eb7a301bc536 。
MVC中的 TempData 可以在Controller之間進行傳遞,如果使用過了之後,不管是在View里使用,還是在controller里使用,再次獲取就為Null 。因此,我們可以總結TempData對象有兩個特點。
1:可以在Controller之間傳遞數據。
2:只能使用一次,獲取數據後,再次獲取,得到的結果就是 Null 。
直接看源碼,就可以理解為什麼會這樣。
在Controller調用Action方法之前,調用了PossiblyLoadTempData方法,執行方法之後調用了PossiblySaveTempData方法
這兩個方法其實就是一個載入TempData數據,一個保存TempData數據。
然後我們看一下TempData是什麼
看到源碼之後,我們知道他是一個TempDataDictionary類型的屬性。
然後我們去看 TempData.Load()和TempData.Save() 方法的源碼
通過源碼我們知道,他是通過ITempDataProvider的LoadTempData方法來載入數據,SaveTempData方法來保存數據。因為ITempDataProvider是一個介面,所以我們要找到具體的實現類,所以我們就要找到調用這個Load和Save方法時傳入的是一個什麼類型的值。
然後我們在類 SessionStateTempDataProvider中找到這兩個方法的具體實現,有三個重要的地方我做了紅色標記。所以從源碼中我們可以知道,它是保存在了Session中,而且在Session裡面讀取值,讀取成功後會Remove掉。這就解釋了它的第一個特點:可以在Controller之間傳遞數據。
然後我們再看它為什麼會有第二個特點:只能使用一次,獲取數據後,再次獲取,得到的結果就是 Null 。別的不啰嗦,直接上關鍵點。
在用索引器獲取到數據時,它都把HashSet<string>集合的 _initialKeys移除掉。然後我們再回頭去看TempData的Save方法。我再把源代碼截圖一次
arg_26_1就是個返回Bool類型的委托,這個委托的執行結果 作為TempData移除數據的條件。因為_initialKeys這個集合在索引器獲取數據時移除了對應的key鍵,所以return !tempData._initialKeys.Contains(key) && !tempData._retainedKeys.Contains(key)就會返回true。所以就會從Dictionary字典中移除數據。
所以這就是TempData具有第二個特點的原因啦。
這裡面還有一些細節不懂的溝通評論。