使用ASP.NET MVC時間不短了,可是對於ViewData和ViewBag一直是「老虎老鼠,傻傻分不清楚」。
今天在《ASP.NET MVC4框架揭祕》上讀到一句話:ViewBag和ViewData共享着相同的數據框架
是這樣的嗎?我半信半疑,因而決定詳細瞭解一下這兩位好基友的狀況。
<!--more-->
既然結論是「共享着相同的數據」,那咱們就證明一下吧。
spa
看來結論是正確的。code
去查看定義,發現他們的類型是不同的,ViewData是ViewDataDictionary
,ViewBag是dynamic
。
rem
下個斷點,看一下監控
這時候發現ViewBag的類型不是定義中的dynamic
,變成了是DynamicViewDataDictionary
既然數據是共享的同一份,那這個ViewDataDictionary
和DynamicViewDataDictionary
,又有什麼關係呢?get
使用ILSpy反編譯發現ViewBag的代碼是這樣的:
it
ViewBag返回的是_dynamicViewData
,
繼續跟蹤發現_dynamicViewData
的類型是DynamicViewDataDictionary
,
io
再看DynamicViewDataDictionary
,發現TryGetMember
和TrySetMember
兩個方法,操做的實質上都是ViewData
因此,ViewBag的get,實際上是對整個ViewData的get編譯
而咱們對ViewBag的動態屬性進行賦值,值其實是存到了ViewData中,動態屬性的名存成了ViewDataDictionary的鍵,動態屬性的值存成了ViewDataDictionary的值。
ViweBag實際上是一個包了一層Dynamic的ViewData,兩個好基友共用的是一個容器!class