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

相关文章
相关标签/搜索