ViewData和ViewBag的那些事

使用ASP.NET MVC時間不短了,可是對於ViewData和ViewBag一直是「老虎老鼠,傻傻分不清楚」。
今天在《ASP.NET MVC4框架揭祕》上讀到一句話:ViewBag和ViewData共享着相同的數據框架

00.jpg
是這樣的嗎?我半信半疑,因而決定詳細瞭解一下這兩位好基友的狀況。
<!--more-->
既然結論是「共享着相同的數據」,那咱們就證明一下吧。
001.jpgspa

002.jpg

02.jpg
看來結論是正確的。code

去查看定義,發現他們的類型是不同的,ViewData是ViewDataDictionary,ViewBag是dynamic
01.jpgrem

下個斷點,看一下監控
04.jpg
03-1.jpg
這時候發現ViewBag的類型不是定義中的dynamic,變成了是DynamicViewDataDictionary
既然數據是共享的同一份,那這個ViewDataDictionaryDynamicViewDataDictionary,又有什麼關係呢?get

使用ILSpy反編譯發現ViewBag的代碼是這樣的:
05.jpgit

ViewBag返回的是_dynamicViewData
繼續跟蹤發現_dynamicViewData的類型是DynamicViewDataDictionary,
05-1.jpgio

再看DynamicViewDataDictionary,發現TryGetMemberTrySetMember兩個方法,操做的實質上都是ViewData
06.jpg
因此,ViewBag的get,實際上是對整個ViewData的get編譯

而咱們對ViewBag的動態屬性進行賦值,值其實是存到了ViewData中,動態屬性的名存成了ViewDataDictionary的鍵,動態屬性的值存成了ViewDataDictionary的值。
ViweBag實際上是一個包了一層Dynamic的ViewData,兩個好基友共用的是一個容器!class

相關文章
相關標籤/搜索