Answers:
ViewBag
是类型,dynamic
但在内部是System.Dynamic.ExpandoObject()
声明如下:
dynamic ViewBag = new System.Dynamic.ExpandoObject();
这就是为什么您可以这样做:
ViewBag.Foo = "Bar";
扩展器目标代码示例:
public class ExpanderObject : DynamicObject, IDynamicMetaObjectProvider
{
public Dictionary<string, object> objectDictionary;
public ExpanderObject()
{
objectDictionary = new Dictionary<string, object>();
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
object val;
if (objectDictionary.TryGetValue(binder.Name, out val))
{
result = val;
return true;
}
result = null;
return false;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
try
{
objectDictionary[binder.Name] = value;
return true;
}
catch (Exception ex)
{
return false;
}
}
}
public object ViewBag { get; }
在ViewBag的MSDN页面上说了,但我购买您的说法是它是一个ExpandoObject
。我喜欢在这里与ViewData进行比较:“ 所以基本上[ViewBag]用魔术属性替换了[ViewData]中的魔术字符串 ”。; ^)
这是一个动态对象,这意味着您可以在控制器中向其添加属性,并稍后在视图中读取它们,因为您实际上是在创建对象时创建动态类型的功能。请参阅有关动态的MSDN文章。请参阅 本文,了解它与MVC的用法。
如果要将其用于Web表单,则将动态属性添加到基类中,如下所示:
public class BasePage : Page
{
public dynamic ViewBagProperty
{
get;
set;
}
}
让您的所有页面都继承自此。您应该可以在ASP.NET标记中执行以下操作:
<%= ViewBagProperty.X %>
那应该工作。如果没有,则有解决方法。
该ViewBag
是System.Dynamic.ExpandoObject
的建议。中的属性ViewBag
本质上是KeyValue
对,您可以在其中通过键访问值。从这个意义上讲,它们是等效的:
ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";
ViewBag用于从Controller Action传递数据以查看以呈现正在传递的数据。现在,您可以使用ViewBag或ViewData在Controller Action和View之间传递数据。ViewBag:这是动态对象的类型,这意味着您可以向Viewbag动态添加新字段,并在View中访问这些字段。创建新字段时,您需要初始化viewbag的对象。
例如:1.创建ViewBag:ViewBag.FirstName =“ John”;