web-dev-qa-db-fra.com

Comment fonctionne ViewBag dans ASP.NET MVC

Comment fonctionne la variable ViewBag d'ASP.NET MVC? MSDN indique que c'est simplement une Object, ce qui m'intrigue, comment fonctionnent les propriétés "magiques" telles que ViewBag.Foo et les chaînes magiques ViewBag["Hello"]?

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

Des exemples seraient vraiment appréciés!

92
Aniket Inge

ViewBag est de type dynamic mais, en interne, est une System.Dynamic.ExpandoObject()

Il est déclaré comme ça:

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

c'est pourquoi vous pouvez faire:

ViewBag.Foo = "Bar";

Exemple de code d'objet d'extension:

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;
        }
    }
}
87
Aniket Inge

C'est un objet dynamique, ce qui signifie que vous pouvez 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é du type dynamique. Voir cet article MSDN sur la dynamique. Voir cet article sur son utilisation par rapport à MVC.

Si vous souhaitez utiliser cela pour les formulaires Web, ajoutez une propriété dynamique à une classe de page de base de la manière suivante:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

Toutes vos pages héritent de cela. Vous devriez pouvoir, dans votre balisage ASP.NET, faire:

<%= ViewBagProperty.X %>

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

32
Brian Mains

La ViewBag est un System.Dynamic.ExpandoObject comme suggéré. Les propriétés de la variable ViewBag sont essentiellement des paires KeyValue où vous pouvez accéder à la valeur par la clé. En ce sens, ils sont équivalents:

ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";
7
Konstantin Dinev

ViewBag est utilisé pour transmettre des données de l'action Controller à la visualisation afin de restituer les données transmises. Vous pouvez désormais transmettre des données en utilisant Action contrôleur et Vue à l'aide de ViewBag ou ViewData . ViewBag: 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 lors de la création de nouveaux champs.

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

  1. Accès à View: @ ViewBag.FirstName.
4
Sachin Gaikwad

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' .

L'implémentation interne de ViewBag enregistre Foo dans ViewData["Foo"] (type de ViewDataDictionary), donc ces 2 sont interchangeables. ViewData["Foo"] et ViewBag.Foo.

Et la portée. ViewBag et ViewData doivent permettre de transmettre des données entre les actions du contrôleur et le rendu de View.

2
Nenad

ViewBag est un type dynamique qui vous permet de définir ou d'obtenir de manière dynamique des valeurs 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 du contrôleur à la vue . Dans 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

0
Dexter