ASP.NET MVC中的ViewBag是如何工作的

ASP.NET MVC的ViewBagViewBag工作的? MSDN表示这只是一个Object ,这让我很感兴趣, ViewBag.Foo和魔术stringViewBag["Hello"]等“Magic”属性是如何工作的?

另外,我怎么能做一个,并在我的ASP.NET WebForms应用程序中使用它?

例子将非常感激!

ViewBagdynamictypes,但在内部是一个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; } } } 

这是一个dynamic对象,这意味着你可以在控制器中添加属性,并在以后的视图中读取它们,因为你本质上是在创build对象,这是dynamictypes的一个特性。 看到这个MSDN文章的dynamic。 看到这篇文章关于它的用法与MVC。

如果你想使用这个Web表单,像这样添加一个dynamic属性到一个基本类:

 public class BasePage : Page { public dynamic ViewBagProperty { get; set; } } 

让所有的页面都从这里inheritance。 您应该能够在您的ASP.NET标记中执行:

 <%= ViewBagProperty.X %> 

这应该工作。 如果没有,有办法解决这个问题。

build议ViewBag是一个System.Dynamic.ExpandoObjectViewBag中的属性本质上是KeyValue对,您可以在其中通过键访问值。 在这个意义上说,这些是等价的

 ViewBag.Foo = "Bar"; ViewBag["Foo"] = "Bar"; 

ViewBag用于传递Controller Action中的数据以查看呈现传递的数据。 现在,您可以使用ViewBag或ViewData在Controller Action和View之间传递数据。 ViewBag:它是Dynamic对象的types,这意味着您可以dynamic添加新字段到viewbag,并在View中访问这些字段。 您需要在创build新字段时初始化viewbag的对象。

例如:1.创buildViewBag:ViewBag.FirstName =“John”;

  1. 访问视图:@ ViewBag.FirstName。

ViewBag是dynamictypes的。 更多,你不能做ViewBag["Foo"] 。 您将得到exception – 无法将[]的索引应用于types为“System.Dynamic.DynamicObject”的expression式

ViewBag内部实现实际上将Foo存储到ViewData["Foo"] (ViewDataDictionarytypes)中,所以这两个是可以互换的。 ViewData["Foo"]ViewBag.Foo

和范围。 ViewBag和ViewData可以在Controller的Actions和View之间传递数据。

 public dynamic ViewBag { get { if (_viewBag == null) { _viewBag = new DynamicViewData(() => ViewData); } return _viewBag; } }