使用ASP.NET MVC时间不短了,但是对于ViewData和ViewBag一直是“老虎老鼠,傻傻分不清楚”。
今天在《ASP.NET MVC4框架揭秘》上读到一句话:ViewBag和ViewData共享着相同的数据
是这样的吗?我半信半疑,于是决定详细了解一下这两位好基友的情况。
<!--more-->
既然结论是“共享着相同的数据”,那我们就证实一下吧。
看来结论是正确的。
去查看定义,发现他们的类型是不一样的,ViewData是ViewDataDictionary
,ViewBag是dynamic
。
下个断点,看一下监控
这时候发现ViewBag的类型不是定义中的dynamic
,变成了是DynamicViewDataDictionary
既然数据是共享的同一份,那这个ViewDataDictionary
和DynamicViewDataDictionary
,又有什么关系呢?
使用ILSpy反编译发现ViewBag的代码是这样的:
ViewBag返回的是_dynamicViewData
,
继续跟踪发现_dynamicViewData
的类型是DynamicViewDataDictionary
,
再看DynamicViewDataDictionary
,发现TryGetMember
和TrySetMember
两个方法,操作的实质上都是ViewData
所以,ViewBag的get,其实是对整个ViewData的get
而我们对ViewBag的动态属性进行赋值,值实际上是存到了ViewData中,动态属性的名存成了ViewDataDictionary的键,动态属性的值存成了ViewDataDictionary的值。
ViweBag其实是一个包了一层Dynamic的ViewData,两个好基友共用的是一个容器!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。