在ASP.NET MVC中,属性ViewBag
属于动态类型。
Throught the code,ViewBag
的各种“属性”被分配到:
ViewBag.Message = "Hello world";
ViewBag.Title = "Page title";
这是如何工作的?从阅读docs我得到ViewBag
本身可以做什么,但为什么(或如何)为动态类型工作的“成员”分配东西?
以下是ViewBag
类中public abstract class ControllerBase : IController
的定义方式:
[Dynamic]
public dynamic ViewBag { get; }
//
// Summary:
// Gets or sets the dictionary for view data.
//
// Returns:
// The dictionary for the view data.
public ViewDataDictionary ViewData { get; set; }
好奇。
相关问题: Where can I find the official documentation for DynamicViewDataDictionary?
答案 0 :(得分:4)
ViewBag
是ExpandoObject
或类似的东西。这基本上只是一个美化的词典,其中“属性”是关键。
<强>更新强>:
实际上,它是一个DynamicViewDataDictionary
,一个ASP.NET MVC源代码内部的类。此类继承自DynamicObject
,如果ViewDataDictionary
属于ViewBag
ViewData
属性ControllerBase
,则只是TryGetMember
的包装。
正如您在TrySetMember
和ViewData
中看到的那样,调用将被委托给{{1}}而没有任何逻辑。
答案 1 :(得分:0)
“Visual C#2010引入了一种新的动态类型。类型是静态类型,但动态类型的对象绕过静态类型检查。在大多数情况下,它的功能类似于它具有类型对象。在编译时,一个元素键入为动态的假定支持任何操作。因此,您不必担心对象是从COM API,动态语言(如IronPython),HTML文档对象模型(DOM)获取其值,从反射,或从程序中的其他地方。但是,如果代码无效,错误将在运行时捕获。“