--摘录自ASP.NET MVC 4高级编程
从技术角度讲,数据从控制器传送到视图是通过一个名为 ViewData 的 ViewDataDictionary (这是一个特殊的字典类)。我们可以使用标准的字典语法设置或读取其中的值,实例如下:
ViewData["CurrentTime"] = DateTime.Now;
尽管这种语法现在也能使用,但是ASP.NET MVC 3拥有更简单的语法,它利用了C# 4 的 dynamic 字段。ViewBag 是 ViewData 的动态封装器。这样我们就可以按照下面的方式来设置值:
ViewBag.CurrentTime = DateTime.Now;
因此,ViewBag.CurrentTime 等同于 ViewData["CurrentTime"]。
大多数情况下,这两种语法彼此之间并不存在真正的技术差异。ViewBag 相对于字典语法而言仅仅是一种受开发人员欢迎的语法而已。
注意:尽管选择一种语法格式并不比选择另一种格式具有真正的技术优势,但是二者之间的一些关键差异还是需要知道的。
很明显的一个差异就是只有当要访问的关键字是一个有效的C#标识符时,ViewBag才起作用。例如,如果在ViewData["Key With Spaces"]中存放一个值,那么就不能使用ViewBag访问。因为这样根本就无法通过编译。
另一个需要知道的重要差异是,动态值不能作为一个参数传递给扩展方法。因为C#编译器为了选择正确的扩展方法,在编译时必须知道每一个参数的真正类型。
如果其中任何一个参数是动态的,那么就不能通过编译。例如,这行代码就会编译失败:
@Html.TextBox("name",ViewBag.Name)。
要使这行代码通过编译有两种方法:第一是使用 ViewData["Name"],第二是把 ViewBag.Name 值转换为一个具体的类型:(string)ViewBag.Name。
ViewData和ViewBag