Funktionsweise von ViewBag in ASP.NET MVC

101

Wie funktioniert die ASP.NET MVC ViewBag? MSDN sagt, es ist nur eine Object, was mich fasziniert, wie funktionieren "Magic" -Eigenschaften wie ViewBag.Foound Magic Strings ViewBag["Hello"]tatsächlich?

Wie kann ich eine erstellen und in meiner ASP.NET WebForms-App verwenden?

Beispiele wären sehr dankbar!

Aniket Inge
quelle
Das Konzept scheint in WebForms nicht erforderlich zu sein, da die Seite bereits direkten Zugriff auf Variablen in ihrem Code hinter der Datei hat. Während in MVC die Ansicht keinen Zugriff auf etwas im Controller hat, außer auf Daten, die in der Ansicht ViewBag oder Model übergeben werden.
Richard Dalton

Antworten:

91

ViewBagist vom Typ dynamic, ist aber intern einSystem.Dynamic.ExpandoObject()

Es wird so deklariert:

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

Deshalb können Sie Folgendes tun:

ViewBag.Foo = "Bar";

Ein Beispiel für einen Expander-Objektcode:

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
quelle
1
Seltsam , dass es nur public object ViewBag { get; }auf der MSDN-Seite für ViewBag steht , aber ich kaufe Ihre Behauptung, dass es eine istExpandoObject . Ich mag den Vergleich mit ViewData hier : " Im Grunde ersetzt [ViewBag] magische Zeichenfolgen [in ViewData] ... durch magische Eigenschaften ". ; ^)
Ruffin
@ Ruffin seltsam seltsam, dass es public object ViewBag { get; }auf MSDN sagt , Code sagt, es ist, dynamic ViewBag { get .. was intern vom Typ DynamicViewData
Aniket Inge
Sehr schön . Danke, dass du das ausgegraben hast. Und ich habe +1 gemacht und gesagt, dass ich dir geglaubt habe! ; ^)
Ruffin
2
@ Ruffin ein weiterer Fall, in dem die Dokumentation liegt und der Code nie lügt
Aniket Inge
Manchmal bin ich beeindruckt, wenn ich die richtigen Antworten auf nicht so klare / gemischte Fragen finde. Vielen Dank!
Oscar Ortiz
33

Es ist ein dynamisches Objekt, dh Sie können ihm im Controller Eigenschaften hinzufügen und diese später in der Ansicht lesen, da Sie das Objekt im Wesentlichen so erstellen, wie Sie es tun, eine Funktion des dynamischen Typs. Siehe diesen MSDN-Artikel zur Dynamik. In diesem Artikel wird die Verwendung in Bezug auf MVC beschrieben.

Wenn Sie dies für Webformulare verwenden möchten, fügen Sie einer Basisseitenklasse wie folgt eine dynamische Eigenschaft hinzu:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

Lassen Sie alle Ihre Seiten davon erben. In Ihrem ASP.NET-Markup sollten Sie in der Lage sein:

<%= ViewBagProperty.X %>

Das sollte funktionieren. Wenn nicht, gibt es Möglichkeiten, dies zu umgehen.

Brian Mains
quelle
Ich weiß, was ViewBag ist. Ich möchte wissen, wie man ein solches Objekt in WebForms erstellt, was bedeutet, dass ich es von Hand codieren möchte.
Aniket Inge
Oben mit einer Implementierung aktualisiert.
Brian Mains
8

Das ViewBagist ein System.Dynamic.ExpandoObjectwie vorgeschlagen. Die Eigenschaften in ViewBagsind im Wesentlichen KeyValuePaare, bei denen Sie über den Schlüssel auf den Wert zugreifen. In diesem Sinne sind diese gleichwertig:

ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";
Konstantin Dinev
quelle
Ich weiß, was ViewBag ist. Ich möchte wissen, wie man ein solches Objekt in WebForms erstellt, was bedeutet, dass ich es von Hand codieren möchte.
Aniket Inge
@Aniket Sie haben einen ViewState in Webformularen.
Konstantin Dinev
5

ViewBag wird verwendet, um Daten von der Controller-Aktion an die Ansicht zu übergeben, um die übergebenen Daten zu rendern. Jetzt können Sie Daten mithilfe von ViewBag oder ViewData zwischen Controller Action und View übergeben. ViewBag: Dies ist eine Art dynamisches Objekt. Dies bedeutet, dass Sie dem Viewbag dynamisch neue Felder hinzufügen und auf diese Felder in der Ansicht zugreifen können. Sie müssen das Objekt von viewbag zum Zeitpunkt der Erstellung neuer Felder initialisieren.

Beispiel: 1. ViewBag erstellen: ViewBag.FirstName = "John";

  1. Zugriff auf View: @ ViewBag.FirstName.
Sachin Gaikwad
quelle
3

ViewBag ist vom Typ dynamisch. Mehr kannst du nicht tun ViewBag["Foo"]. Es wird eine Ausnahme angezeigt . Die Indizierung mit [] kann nicht auf einen Ausdruck vom Typ 'System.Dynamic.DynamicObject' angewendet werden .

Die interne Implementierung von ViewBagspeichert Foo tatsächlich in ViewData["Foo"](Typ von ViewDataDictionary), sodass diese beiden austauschbar sind. ViewData["Foo"]und ViewBag.Foo.

Und Umfang. ViewBag und ViewData dienen zum Übertragen von Daten zwischen den Aktionen des Controllers und dem Rendern von View.

Nenad
quelle
0

ViewBag ist ein dynamischer Typ, mit dem Sie Werte dynamisch festlegen oder abrufen und beliebig viele zusätzliche Felder ohne eine stark typisierte Klasse hinzufügen können. Mit ihnen können Sie Daten vom Controller an die Ansicht übergeben. In der Steuerung ......

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

Im Hinblick auf

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

Was ich gelernt habe ist, dass beide die Eigenschaft zum Speichern des dynamischen Namens haben sollten, dh ViewBag.victor

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

        return _viewBag;
    }
}
Schritte
quelle
3
Ich bitte Sie, einen Kontext / Kommentar zu dem Code hinzuzufügen, den Sie geteilt haben. Es wird dem Fragesteller und anderen zukünftigen Lesern helfen, Ihren Beitrag besser zu verstehen.
RBT