Cómo funciona ViewBag en ASP.NET MVC

102

¿Cómo funcionan los MVC de ASP.NET ViewBag ? MSDN dice que es sólo un Object, lo que me intriga, ¿cómo funcionan realmente las propiedades "mágicas" como ViewBag.Foolas cuerdas mágicas ViewBag["Hello"]?

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

¡Los ejemplos serían muy apreciados!

Aniket Inge
fuente
El concepto no parece ser necesario en WebForms ya que la página ya tiene acceso directo a las variables en su código subyacente al archivo. Mientras que en MVC la vista no tiene acceso a nada en el controlador aparte de los datos que se pasan a la vista ViewBag o Model.
Richard Dalton

Respuestas:

91

ViewBages de tipo dynamicpero, internamente es unSystem.Dynamic.ExpandoObject()

Se declara así:

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

por eso puedes hacer:

ViewBag.Foo = "Bar";

Ejemplo de código de objeto de expansor:

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;
        }
    }
}
Aniket Inge
fuente
1
Es extraño que solo diga public object ViewBag { get; }en la página de MSDN para ViewBag , pero estoy comprando su afirmación de que es unExpandoObject . Me gusta la comparación con ViewData aquí : " Así que básicamente [ViewBag] reemplaza cadenas mágicas [en ViewData] ... con propiedades mágicas ". ; ^)
ruffin
@ruffin extrañamente extraño que dice public object ViewBag { get; }en MSDN, el código dice dynamic ViewBag { get .. que internamente es del tipo DynamicViewData
Aniket Inge
Muy bien . Gracias por desenterrar eso. ¡E hice +1 y dije que te creía! ; ^)
ruffin
2
@ruffin otro caso de cuando la documentación miente y el código nunca miente
Aniket Inge
A veces me impresiona encontrar las respuestas correctas a preguntas no tan claras o mixtas. ¡Gracias!
Oscar Ortiz
33

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

Si desea usar esto para formularios web, agregue una propiedad dinámica a una clase de página base así:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

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

<%= ViewBagProperty.X %>

Eso debería funcionar. Si no es así, hay formas de solucionarlo.

Brian Mains
fuente
Sé qué es ViewBag, quiero saber cómo hacer un objeto como ese en WebForms, lo que significa que quiero codificarlo manualmente.
Aniket Inge
Actualizado arriba con una implementación.
Brian Mains
8

El ViewBages System.Dynamic.ExpandoObjectcomo se sugiere. Las propiedades en el ViewBagson esencialmente KeyValuepares, donde se accede al valor mediante la clave. En este sentido estos son equivalentes:

ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";
Konstantin Dinev
fuente
Sé qué es ViewBag, quiero saber cómo hacer un objeto como ese en WebForms, lo que significa que quiero codificarlo manualmente.
Aniket Inge
@Aniket Tiene un ViewState en formularios web.
Konstantin Dinev
5

ViewBag se utiliza para pasar datos de Controller Action a la vista para representar los datos que se pasan. Ahora puede pasar datos entre Controller Action y View, ya sea usando ViewBag o ViewData. ViewBag: Es un tipo de objeto dinámico, eso significa que puede agregar nuevos campos a viewbag dinámicamente y acceder a estos campos en la Vista. Necesita inicializar el objeto de viewbag al momento de crear nuevos campos.

por ejemplo: 1. Creando ViewBag: ViewBag.FirstName = "John";

  1. Accediendo a Ver: @ ViewBag.FirstName.
Sachin Gaikwad
fuente
3

ViewBag es de tipo dinámico. 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 ViewBagrealmente almacena Foo en ViewData["Foo"](tipo de ViewDataDictionary), por lo que esos 2 son intercambiables. ViewData["Foo"]y ViewBag.Foo.

Y alcance. ViewBag y ViewData están indicados para pasar datos entre las acciones del controlador y la vista que se representa.

Nenad
fuente
0

ViewBag es un tipo dinámico que le permite establecer u obtener valores dinámicamente y le permite agregar cualquier número de campos adicionales sin una clase fuertemente tipada. Le permiten pasar datos del controlador a la vista. En 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 deben tener la propiedad de guardar nombre dinámico, es decir, ViewBag.victor

Diestro
fuente
-1
public dynamic ViewBag
{
    get
    {
        if (_viewBag == null)
        {
            _viewBag = new DynamicViewData(() => ViewData);
        }

        return _viewBag;
    }
}
pasos
fuente
3
Le solicito que agregue algún contexto / comentario sobre el código que ha compartido. Ayudará al autor de la pregunta y a otros futuros lectores a comprender mejor su publicación.
RBT