Cómo funciona ViewBag en ASP.NET MVC

¿Cómo funciona el ViewBag ASP.NET MVC? MSDN dice que es solo un Object , lo que me intriga, ¿cómo funcionan ViewBag.Foo propiedades “Mágicas” como ViewBag.Foo y Magic Strings ViewBag["Hello"] ?

Además, ¿cómo puedo hacer uno y usarlo en mi aplicación ASP.NET WebForms?

¡Los ejemplos serían realmente apreciados!

ViewBag es de tipo dynamic , pero internamente es System.Dynamic.ExpandoObject()

Se declara así:

dynamic ViewBag = new System.Dynamic.ExpandoObject();

que es por lo que puedes hacer:

ViewBag.Foo = "Bar";

Un ejemplo de código de objeto expansor:

 public class ExpanderObject : DynamicObject, IDynamicMetaObjectProvider { public Dictionary objectDictionary; public ExpanderObject() { objectDictionary = new Dictionary(); } 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; } } } 

Es un objeto dynamic, lo que significa que puede agregarle propiedades en el controlador y leerlas más adelante en la vista, porque básicamente está creando el objeto como lo hace, una característica del tipo dynamic. Vea este artículo de MSDN sobre dinámica. Vea este artículo sobre su uso en relación con MVC.

Si desea utilizar esto para formularios web, agregue una propiedad dinámica a una clase de página base como esta:

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

Haga que todas sus páginas hereden de esto. Debería poder, en su marcado ASP.NET, hacer:

 < %= ViewBagProperty.X %> 

Eso debería funcionar. Si no, hay formas de evitarlo.

ViewBag es un System.Dynamic.ExpandoObject como se sugiere. Las propiedades en ViewBag son esencialmente pares KeyValue , donde accede al valor con la clave. En este sentido, estos son equivalentes:

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

ViewBag se utiliza para pasar datos de Controller Action para ver los datos que se pasan. Ahora puede pasar datos usando entre Controller Action y View usando ViewBag o ViewData. ViewBag: es un tipo de objeto dynamic, lo que significa que puede agregar nuevos campos a viewbag dinámicamente y acceder a estos campos en la vista. Debe inicializar el objeto de viewbag en el momento de crear nuevos campos.

por ejemplo: 1. Creating ViewBag: ViewBag.FirstName = “John”;

  1. Acceso a la vista: @ ViewBag.FirstName.

ViewBag es de tipo dynamic. Más, no puedes hacer ViewBag["Foo"] . Obtendrá una excepción: no se puede aplicar la indexación con [] a una expresión de tipo ‘System.Dynamic.DynamicObject’ .

La implementación interna de ViewBag realmente almacena Foo en ViewData["Foo"] (tipo de ViewDataDictionary), por lo que esos 2 son intercambiables. ViewData["Foo"] y ViewBag.Foo .

Y scope ViewBag y ViewData están destinados a pasar datos entre las Acciones del Controlador y Ver los renders.

ViewBag es un tipo dynamic que le permite establecer dinámicamente u obtener valores y le permite agregar cualquier cantidad de campos adicionales sin una clase de tipo fuerte. Le permiten pasar datos del controlador para ver. En el controlador ……

 public ActionResult Index() { ViewBag.victor = "My name is Victor"; return View(); } 

En vista

 @foreach(string a in ViewBag.victor) { ......... } 

Lo que he aprendido es que ambos deberían tener la propiedad de guardar nombre dynamic, es decir, ViewBag.victor

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