95 votes

Comment fonctionne ViewBag dans ASP.NET MVC ?

Comment le système MVC d'ASP.NET ViewBag travail ? MSDN dit que c'est juste un Object ce qui m'intrigue, comment les propriétés "magiques" telles que ViewBag.Foo et des ficelles magiques ViewBag["Hello"] fonctionne réellement ?

En outre, comment puis-je en créer un et l'utiliser dans mon application ASP.NET WebForms ?

Des exemples seraient vraiment appréciés !

87voto

Aniket Points 15250

ViewBag est de type dynamic mais, en interne, c'est un System.Dynamic.ExpandoObject()

Elle est déclarée comme ceci :

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

c'est pourquoi vous pouvez faire :

ViewBag.Foo = "Bar";

Un exemple de code objet d'expandeur :

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;
        }
    }
}

32voto

Brian Mains Points 31772

Il s'agit d'un objet dynamique, ce qui signifie que vous pouvez lui ajouter des propriétés dans le contrôleur, et les lire plus tard dans la vue, car vous créez essentiellement l'objet au fur et à mesure, une caractéristique du type dynamique. Voir ce qui suit Article de MSDN sur la dynamique. Voir cet article sur son utilisation en relation avec MVC.

Si vous souhaitez utiliser cette méthode pour les formulaires Web, ajoutez une propriété dynamique à une classe de page de base, comme suit :

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

Faites en sorte que toutes vos pages en héritent. Vous devriez être en mesure de le faire dans votre balisage ASP.NET :

<%= ViewBagProperty.X %>

Cela devrait fonctionner. Sinon, il existe des moyens de contourner le problème.

7voto

El ViewBag est un System.Dynamic.ExpandoObject comme suggéré. Les propriétés de la ViewBag sont essentiellement KeyValue où l'on accède à la valeur par la clé. En ce sens, elles sont équivalentes :

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

5voto

Sachin Gaikwad Points 325

ViewBag est utilisé pour passer des données du contrôleur à l'action à la vue pour rendre les données qui sont passées. Vous pouvez maintenant passer des données entre l'action du contrôleur et la vue en utilisant ViewBag ou ViewData. ViewBag : Il s'agit d'un type d'objet dynamique, ce qui signifie que vous pouvez ajouter de nouveaux champs à Viewbag de manière dynamique et accéder à ces champs dans la vue. Vous devez initialiser l'objet de viewbag au moment de la création de nouveaux champs.

par exemple 1. Création de ViewBag : ViewBag.FirstName="John" ;

  1. Accès à la vue : @ViewBag.FirstName.

3voto

Nenad Points 3779

ViewBag est de type dynamic. De plus, vous ne pouvez pas faire ViewBag["Foo"] . Vous obtiendrez une exception - Impossible d'appliquer l'indexation avec [] à une expression de type 'System.Dynamic.DynamicObject'. .

Mise en œuvre interne de ViewBag stocke en fait Foo dans ViewData["Foo"] (type de ViewDataDictionary), ces 2 éléments sont donc interchangeables. ViewData["Foo"] y ViewBag.Foo .

Et la portée. ViewBag et ViewData servent à transmettre des données entre les actions du contrôleur et la vue qu'il rend.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X