Fonctionnement de ViewBag dans ASP.NET MVC

102

Comment fonctionne le MVC ASP.NET ViewBag? MSDN dit que c'est juste un Object, ce qui m'intrigue, comment les propriétés «magiques» telles que ViewBag.Fooles cordes magiques ViewBag["Hello"]fonctionnent-elles 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!

Aniket Inge
la source
Le concept ne semble pas nécessaire dans les formulaires Web car la page a déjà un accès direct aux variables dans son code derrière le fichier. Alors que dans MVC, la vue n'a accès à rien dans le contrôleur à l'exception des données qui sont passées dans la vue ViewBag ou Model.
Richard Dalton

Réponses:

91

ViewBagest de type dynamicmais est en interne unSystem.Dynamic.ExpandoObject()

Il est déclaré comme ceci:

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

c'est pourquoi vous pouvez faire:

ViewBag.Foo = "Bar";

Un exemple de code d'objet Expander:

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
la source
1
Bizarre qu'il soit juste indiqué public object ViewBag { get; }sur la page MSDN pour ViewBag , mais j'achète votre affirmation selon laquelle c'est un ExpandoObjectfichier . J'aime la comparaison avec ViewData ici : " Donc, fondamentalement, [ViewBag] remplace les chaînes magiques [dans ViewData] ... par des propriétés magiques ". ; ^)
ruffin
@ruffin étrangement étrange que ce soit dit public object ViewBag { get; }sur MSDN, Code dit que c'est dynamic ViewBag { get .. qui en interne est de type DynamicViewData
Inge
Très sympa . Merci d'avoir déterré ça. Et j'ai fait +1 et j'ai dit que je vous croyais! ; ^)
ruffin
2
@ruffin un autre cas de quand la documentation ment et le code ne ment jamais
Aniket Inge
Parfois, je suis impressionné lorsque je trouve les bonnes réponses à des questions pas si claires / mélangées. Merci!
Oscar Ortiz
33

C'est 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 comme vous le faites, une fonctionnalité de type dynamique. Voir cet article MSDN sur la dynamique. Consultez cet article sur son utilisation par rapport à MVC.

Si vous souhaitez l'utiliser pour les formulaires Web, ajoutez une propriété dynamique à une classe de page de base comme ceci:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

Faites en sorte que toutes vos pages en héritent. Vous devriez pouvoir, dans votre balisage ASP.NET, faire:

<%= ViewBagProperty.X %>

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

Brian Mains
la source
Je sais ce qu'est ViewBag, je veux savoir comment créer un objet comme ça dans WebForms, ce qui signifie que je veux le coder à la main.
Aniket Inge
Mis à jour ci-dessus avec une implémentation.
Brian Mains
8

Le ViewBagest un System.Dynamic.ExpandoObjectcomme suggéré. Les propriétés dans le ViewBagsont essentiellement des KeyValuepaires, où vous accédez à la valeur par la clé. En ce sens, ils sont équivalents:

ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";
Konstantin Dinev
la source
Je sais ce qu'est ViewBag, je veux savoir comment créer un objet comme ça dans WebForms, ce qui signifie que je veux le coder à la main.
Aniket Inge
@Aniket Vous avez un ViewState dans les formulaires Web.
Konstantin Dinev
5

ViewBag est utilisé pour transmettre les données de l'Action du contrôleur à la vue afin de rendre les données transmises. Vous pouvez désormais transmettre des données à l'aide de Controller Action et View en utilisant ViewBag ou ViewData. ViewBag: C'est un type d'objet dynamique, cela signifie que vous pouvez ajouter de nouveaux champs à viewbag dynamiquement 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 à View: @ ViewBag.FirstName.
Sachin Gaikwad
la source
3

ViewBag est de type dynamique. 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» .

Implémentation interne de ViewBagstocke réellement Foo dans ViewData["Foo"](type de ViewDataDictionary), donc ces 2 sont interchangeables. ViewData["Foo"]et ViewBag.Foo.

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

Nenad
la source
0

ViewBag est un type dynamique qui vous permet de définir ou d'obtenir des valeurs de manière dynamique et vous permet d'ajouter un nombre quelconque de champs supplémentaires sans classe fortement typée.Ils vous permettent de transmettre des données d'un contrôleur à l'autre. Dans le contrôleur ......

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

En vue

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

Ce que j'ai appris, c'est que les deux devraient avoir la propriété save dynamic name, c'est-à-dire ViewBag.victor

Dexter
la source
-1
public dynamic ViewBag
{
    get
    {
        if (_viewBag == null)
        {
            _viewBag = new DynamicViewData(() => ViewData);
        }

        return _viewBag;
    }
}
trace de pas
la source
3
Je vous demande de bien vouloir ajouter un contexte / commentaire autour du code que vous avez partagé. Cela aidera le demandeur et les autres futurs lecteurs à mieux comprendre votre message.
RBT