ASP.NET MVC中的ViewBag是如何工作的
ASP.NET MVC的ViewBag
是ViewBag
工作的? MSDN表示这只是一个Object
,这让我很感兴趣, ViewBag.Foo
和魔术stringViewBag["Hello"]
等“Magic”属性是如何工作的?
另外,我怎么能做一个,并在我的ASP.NET WebForms应用程序中使用它?
例子将非常感激!
ViewBag
是dynamic
types,但在内部是一个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.ExpandoObject
。 ViewBag
中的属性本质上是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”;
- 访问视图:@ 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; } }
- 如何使用int ID列更改ASP.net Identity 2.0的表名?
- ASP.NET MVC 5与AngularJS / ASP.NET WebAPI
- 您在* nix服务器上为ASP.NET Core制作哪个Web服务器?
- 使用ASP.NET Core DI解决实例
- unit testingASP.NET DataAnnotationsvalidation
- 我如何把提示放在asp:文本框中
- Web应用程序问题(web.config错误)使用IIS7.5和ASP.NET v2的HTTP 500.19
- 启动debugging时停止Visual Studio启动一个新的浏览器窗口?
- 对象不能从DBNull转换为其他types