it-swarm.com.de

Wie funktioniert ViewBag in ASP.NET MVC im Hintergrund?

Ich lese gerade ein Buch über ASP.NET MVC und frage mich, wie das folgende Beispiel funktioniert:

Beispiel 1

Regler

public class MyController : Controller
{
    public ActionResult Index()
    {
        ViewBag.MyProperty = 5;

        return View();
    }
}

Aussicht

<h1>@ViewBag.MyProperty</h1>

Jetzt verstehe ich, dass ViewBag ein dynamisches Objekt ist. Auf diese Weise können Sie die Eigenschaft festlegen (obwohl ich nicht viel über dynamische Objekte weiß, aber nie damit gearbeitet habe). Aber wie erhält die Ansicht die spezifische Instanz der ViewBag vom Controller, obwohl wir nichts direkt übergeben?

Ich dachte, dass das ViewBag ein publicstatic - Objekt sein könnte, aber jede Änderung daran wäre global und nicht spezifisch für eine Ansichtsinstanz.

Könnten Sie näher erläutern, wie dies hinter den Kulissen funktioniert?

Beispiel # 2

Regler

public class MyController : Controller
{
    public ActionResult Index()
    {
        ViewBag.MyProperty = 5;

        return View();
    }

    public ActionResult Index2()
    {
        ViewBag.MyProperty = 6;

        return View();
    }
}

Nehmen wir nun an, die Methode Index wird zuerst aufgerufen und dann das Index2. Am Ende ist der Wert von ViewBag.MyProperty ergibt 6 (der Wert von Index2). Ich habe das Gefühl, dass dies keine gute Sache ist, aber gleichzeitig habe ich das Gefühl, dass ich in Bezug auf die Desktop-Entwicklung denke. Vielleicht spielt es keine Rolle, wenn Sie mit ASP.NET MVC verwendet werden, da das Web zustandslos ist. Ist das der Fall?

33
hattenn

ViewBag ist eine Eigenschaft von ControllerBase, von der alle Controller erben müssen. Es ist ein dynamic -Objekt. Aus diesem Grund können Sie ihm neue Eigenschaften hinzufügen, ohne Kompilierungsfehler zu verursachen.

Es ist nicht static, es ist ein Mitglied des Objekts. Während der Gültigkeitsdauer der Anforderung wird die Controller-Instanz erstellt und entsorgt, sodass Sie keine Probleme mit dem gemeinsamen Zugriff haben, wie z. B. das Überschreiben des Werts.

Die Methode View (und ihre Varianten) ist nicht auch static, und auf diese Weise erhält die Ansicht die Werte ViewBag: Während des Renderns der Ansicht wird der Controller Instanz hat auch seine ViewBag-Instanz.

28
Andre Calil

ViewBag ist eine Eigenschaft von ControllerBase . Es ist wie folgt definiert:

public Object ViewBag { get; }

Beachten Sie, dass diese Signatur tatsächlich falsch ist. So sieht der Quellcode tatsächlich aus:

public dynamic ViewBag {
        get {
            if (_dynamicViewDataDictionary == null) {
                _dynamicViewDataDictionary = new DynamicViewDataDictionary(() => ViewData);
            }
            return _dynamicViewDataDictionary;
        }
    }

_dynamicViewDataDictionary ist ein ExpandoObject; Sie können ihr zur Laufzeit Eigenschaften hinzufügen. Die Lebensdauer entspricht der des Controllers, also der Lebensdauer der HTTP-Anforderung.

6
Robert Harvey