ASP.NET MVC的ViewBag
是如何工作的?MSDN说它只是一个Object
,这让我很感兴趣,像ViewBag.Foo
和魔术字符串ViewBag["Hello"]
这样的“魔术”属性实际上是如何工作的?
另外,我如何制作一个并在我的ASP.NET WebForms应用程序中使用?
举个例子,我们会很感激的!
发布于 2013-02-21 01:15:53
ViewBag
的类型为dynamic
,但在内部是System.Dynamic.ExpandoObject()
它是这样声明的:
dynamic ViewBag = new System.Dynamic.ExpandoObject();
这就是为什么你可以这样做:
ViewBag.Foo = "Bar";
Expander对象代码示例:
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;
}
}
}
发布于 2013-02-15 21:43:48
它是一个动态对象,这意味着您可以在控制器中向其添加属性,并稍后在视图中读取它们,因为您实际上是在创建对象,这是动态类型的一个特性。请参阅MSDN article on dynamics。查看this article关于它与MVC的用法。
如果您想将其用于web表单,请向基页类添加一个动态属性,如下所示:
public class BasePage : Page
{
public dynamic ViewBagProperty
{
get;
set;
}
}
让你的所有页面都继承自这个页面。您应该能够在ASP.NET标记中执行以下操作:
<%= ViewBagProperty.X %>
这应该行得通。如果没有,有一些方法可以解决它。
发布于 2013-02-15 21:42:45
如建议的那样,ViewBag
是System.Dynamic.ExpandoObject
。ViewBag
中的属性本质上是KeyValue
对,您可以通过键访问值。从这个意义上说,它们是等效的:
ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";
https://stackoverflow.com/questions/14896013
复制相似问题