Come funziona ViewBag in ASP.NET MVC


102

Come funziona ASP.NET MVC ViewBag? MSDN dice che è solo un Object, il che mi intriga, come funzionano effettivamente le proprietà "Magic" come ViewBag.Fooe le stringhe magiche ViewBag["Hello"]?

Inoltre, come posso crearne uno e usarlo nella mia app ASP.NET WebForms?

Gli esempi sarebbero davvero apprezzati!


Il concetto non sembra essere necessario in WebForms poiché la pagina ha già accesso diretto alle variabili nel suo file code behind. Considerando che in MVC la visualizzazione non ha accesso a nulla nel controller a parte i dati che vengono passati in visualizzazione ViewBag o Model.
Richard Dalton

Risposte:


91

ViewBagè di tipo dynamicma internamente è unSystem.Dynamic.ExpandoObject()

È dichiarato così:

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

ecco perché puoi fare:

ViewBag.Foo = "Bar";

Un esempio di codice oggetto 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;
        }
    }
}

1
Strano che sia public object ViewBag { get; }scritto solo sulla pagina MSDN di ViewBag , ma sto comprando la tua affermazione che si tratta di un fileExpandoObject . Mi piace il confronto con ViewData qui : " Quindi fondamentalmente [ViewBag] sostituisce le stringhe magiche [in ViewData] ... con proprietà magiche ". ; ^)
ruffin

@ruffin stranamente strano che dice public object ViewBag { get; }su MSDN, Code dice dynamic ViewBag { get .. che internamente è di tipo DynamicViewData
Aniket Inge

Molto bello . Grazie per averlo scoperto. E ho fatto +1 e ho detto che ti ho creduto! ; ^)
ruffin

2
@ruffin un altro caso in cui la documentazione mente e il codice non mente mai
Aniket Inge

A volte sono impressionato quando trovo le risposte giuste su domande non così chiare / miste. Grazie!
Oscar Ortiz

33

È un oggetto dinamico, il che significa che puoi aggiungere proprietà ad esso nel controller e leggerle in un secondo momento nella vista, perché essenzialmente stai creando l'oggetto come fai, una caratteristica di tipo dinamico. Vedi questo articolo di MSDN sulle dinamiche. Vedi questo articolo sul suo utilizzo in relazione a MVC.

Se vuoi usarlo per i moduli web, aggiungi una proprietà dinamica a una classe di pagina di base in questo modo:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

Tutte le tue pagine ereditano da questo. Dovresti essere in grado, nel tuo markup ASP.NET, di fare:

<%= ViewBagProperty.X %>

Dovrebbe funzionare. In caso contrario, ci sono modi per aggirare il problema.


So cos'è ViewBag, voglio sapere come creare un oggetto del genere in WebForms, il che significa che voglio codificarlo manualmente.
Aniket Inge

Aggiornato sopra con un'implementazione.
Brian Mains

8

Il ViewBagè un System.Dynamic.ExpandoObjectcome suggerito. Le proprietà in ViewBagsono essenzialmente KeyValuecoppie, da cui si accede al valore tramite la chiave. In questo senso sono equivalenti:

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

So cos'è ViewBag, voglio sapere come creare un oggetto del genere in WebForms, il che significa che voglio codificarlo manualmente.
Aniket Inge

@Aniket Hai un ViewState nei moduli web.
Konstantin Dinev

5

ViewBag viene utilizzato per passare i dati dall'azione del controller alla visualizzazione per eseguire il rendering dei dati passati. Ora puoi passare i dati usando tra Controller Action e View usando ViewBag o ViewData. ViewBag: è un tipo di oggetto dinamico, il che significa che puoi aggiungere nuovi campi alla viewbag in modo dinamico e accedere a questi campi nella vista. È necessario inizializzare l'oggetto di viewbag al momento della creazione di nuovi campi.

ad esempio: 1. Creazione di ViewBag: ViewBag.FirstName = "John";

  1. Accesso alla visualizzazione: @ ViewBag.FirstName.

3

ViewBag è di tipo dinamico. Di più, non puoi fare ViewBag["Foo"]. Otterrai un'eccezione: impossibile applicare l'indicizzazione con [] a un'espressione di tipo "System.Dynamic.DynamicObject" .

L'implementazione interna di ViewBagmemorizza effettivamente Foo in ViewData["Foo"](tipo di ViewDataDictionary), quindi quei 2 sono intercambiabili. ViewData["Foo"]e ViewBag.Foo.

E portata. ViewBag e ViewData servono per passare i dati tra le azioni del controller e la visualizzazione che esegue.


0

ViewBag è un tipo dinamico che consente di impostare o ottenere valori dinamicamente e consente di aggiungere un numero qualsiasi di campi aggiuntivi senza una classe fortemente tipizzata. Consentono di passare i dati dal controller alla visualizzazione. Nel controller ...

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

In vista

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

Quello che ho imparato è che entrambi dovrebbero avere la proprietà di salvataggio del nome dinamico, cioè ViewBag.victor


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

        return _viewBag;
    }
}

3
Ti chiedo di aggiungere un contesto / commento sul codice che hai condiviso. Aiuterà il richiedente e altri futuri lettori a comprendere meglio il tuo post.
RBT
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.