Was ist der Unterschied zwischen ViewData und ViewBag?


Antworten:


388

Es verwendet die dynamische Funktion C # 4.0. Es erreicht das gleiche Ziel wie Ansichtsdaten und sollte zugunsten der Verwendung stark typisierter Ansichtsmodelle vermieden werden (genauso wie Ansichtsdaten vermieden werden sollten).

Im Grunde ersetzt es also magische Saiten :

ViewData["Foo"]

mit magischen Eigenschaften :

ViewBag.Foo

für die Sie keine Kompilierungszeitsicherheit haben.

Ich beschuldige Microsoft weiterhin, dieses Konzept jemals in MVC eingeführt zu haben.

Der Name der Eigenschaften unterscheidet zwischen Groß- und Kleinschreibung.


11
Zu welchem ​​Zweck beschuldigen Sie Microsoft? Wenn keine Ansichtsdaten vorhanden sind, wie können wir die Dropdown-Liste vom Modell binden? (Ich denke nicht, dass die Verwendung einer Auswahlliste innerhalb des Modells eine gute Idee wäre)
Subin Jacob

15
@SubinJacob Du solltest wirklich eine neue Frage stellen, wenn du eine Antwort darauf haben willst. Das Erstellen einer SelectList ist definitiv der richtige Weg, um eine Dropdown-Liste zu erstellen.
MiniRagnarok

25
Ich finde das etwas subjektiv. Stark typisierte Modelle sind nett und yada yada, aber für die Szenarien, in denen Sie schnell eine Ansicht zum Laufen bringen, erledigen ViewBag und andere die Arbeit schneller als Controller, View, Model, AutoMapper zu ViewModel usw.
Craig Brett

11
@Darin, warum "beschuldigen" Sie Microsoft, dies eingeführt zu haben? Es ist nur ein Werkzeug für Entwickler. Wenn Sie wissen, was Sie tun, können Sie das Beste daraus machen. Wenn Sie es nicht mögen oder fehleranfälliger sind, verwenden Sie es einfach nicht. :)
Bilal Fazlani

5
Wie schlagen Sie vor, Daten zwischen Partials und Layout zu übertragen? Die Leute beschuldigen, wenn sie nicht das ganze Bild sehen. Ich stelle mir vor, Sie haben überall Basiscontroller und Basisansichtsmodelle oder statische / Singletons-Objekte. Ratet mal, lerne besser, mit Ansichtsdaten umzugehen und beschuldige dich, das falsche Tool für den Job verwendet zu haben.
Bart Calixto

42

Intern werden ViewBag- Eigenschaften als Name / Wert-Paare im ViewData-Wörterbuch gespeichert .

Hinweis: In den meisten Vorabversionen von MVC 3 wurde die ViewBag-Eigenschaft als ViewModel bezeichnet, wie in diesem Snippet aus den Versionshinweisen zu MVC 3 angegeben:

(bearbeitet am 08.10.12) Es wurde vorgeschlagen, die Quelle dieser von mir geposteten Informationen zu veröffentlichen. Hier ist die Quelle: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4

MVC 2-Controller unterstützen eine ViewData-Eigenschaft, mit der Sie Daten mithilfe einer spät gebundenen Wörterbuch-API an eine Ansichtsvorlage übergeben können. In MVC 3 können Sie mit der ViewBag-Eigenschaft auch eine etwas einfachere Syntax verwenden, um denselben Zweck zu erreichen. Anstatt beispielsweise ViewData ["Message"] = "text" zu schreiben, können Sie ViewBag.Message = "text" schreiben. Sie müssen keine stark typisierten Klassen definieren, um die ViewBag-Eigenschaft zu verwenden. Da es sich um eine dynamische Eigenschaft handelt, können Sie stattdessen einfach Eigenschaften abrufen oder festlegen, die zur Laufzeit dynamisch aufgelöst werden. Intern werden ViewBag-Eigenschaften als Name / Wert-Paare im ViewData-Wörterbuch gespeichert. (Hinweis: In den meisten Vorabversionen von MVC 3 wurde die ViewBag-Eigenschaft als ViewModel-Eigenschaft bezeichnet.)


Die Frage fragt nach dem Unterschied zwischen ViewDataund ViewBagnicht nach ViewModel.
Matthew Flaschen

Vielen Dank für das Heads-up Matthew Flaschen, ich hatte einen Tippfehler in der Antwort und habe ihn behoben. Jetzt heißt es "ViewData" anstelle von ViewModel, was ein Fehler war. :)
Rich Bianco

Jetzt ist es falsch. Keiner wurde in den anderen umbenannt. Sie existieren beide noch. Einer ist dynamicund unterstützt ViewBag.Message. Man benutzt die alte ViewData["Message"]Syntax.
Matthew Flaschen

1
+1 Aber aus welcher Quelle zitieren Sie ...? Sollte wirklich einen Link liefern.
Sam

1
Danke Sam für den Vorschlag. Ich habe einen Link zur Originalquelle hinzugefügt.
Rich Bianco

34

ViewBag vs ViewData in MVC

http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

Ähnlichkeiten zwischen ViewBag & ViewData:

Hilft beim Verwalten von Daten, wenn Sie vom Controller zur Ansicht wechseln. Wird verwendet, um Daten vom Controller an die entsprechende Ansicht zu übergeben. Kurze Lebensdauer bedeutet, dass der Wert null wird, wenn eine Umleitung erfolgt. Dies liegt daran, dass ihr Ziel darin besteht, eine Möglichkeit zur Kommunikation zwischen Controllern und Ansichten bereitzustellen. Es ist ein Kommunikationsmechanismus innerhalb des Serveraufrufs.

Unterschied zwischen ViewBag & ViewData:

ViewData ist ein Wörterbuch von Objekten, das von der ViewDataDictionary-Klasse abgeleitet ist und über Zeichenfolgen als Schlüssel zugänglich ist. ViewBag ist eine dynamische Eigenschaft, die die neuen dynamischen Funktionen in C # 4.0 nutzt. ViewData erfordert eine Typumwandlung für komplexe Datentypen und eine Überprüfung auf Nullwerte, um Fehler zu vermeiden. ViewBag erfordert keine Typumwandlung für komplexe Datentypen.

ViewBag & ViewData Beispiel:

public ActionResult Index()
{   
    ViewBag.Name = "Arun Prakash";   
    return View();
}

public ActionResult Index()
{  
    ViewData["Name"] = "Arun Prakash";  
    return View();
}   

In View anrufen

@ViewBag.Name    
@ViewData["Name"]

7
Ihre Antwort zeigt an, typecastingaber Sie haben nicht gezeigt, wie Typografie durchgeführt wird
Alex

31

ViewData: Es erfordert Typumwandlung für komplexe Datentypen und Überprüfung auf Nullwerte, um Fehler zu vermeiden.

ViewBag: Für komplexe Datentypen ist keine Typumwandlung erforderlich.

Betrachten Sie das folgende Beispiel:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var emp = new Employee
        {
            EmpID=101,
            Name = "Deepak",
            Salary = 35000,
            Address = "Delhi"
        };

        ViewData["emp"] = emp;
        ViewBag.Employee = emp;

        return View(); 
    }
}

Und der Code für Viewlautet wie folgt:

@model MyProject.Models.EmpModel;
@{ 
 Layout = "~/Views/Shared/_Layout.cshtml"; 
 ViewBag.Title = "Welcome to Home Page";
 var viewDataEmployee = ViewData["emp"] as Employee; //need type casting
}

<h2>Welcome to Home Page</h2>
This Year Best Employee is!
<h4>@ViewBag.Employee.Name</h4>
<h3>@viewDataEmployee.Name</h3>

6
Hilf mir zu verstehen, aber ich denke, es gibt einen Fehler. Dies <h4>@ViewBag.emp.Name</h4> sollte sich ändern zu<h4>@ViewBag.Employee.Name</h4>
Benny Margalit

24

Alle Antworten legen nahe, dass ViewBagund / oder ViewDataDaten von Controlleran übergeben werden sollenViews der Fehlinformation ist. Beide sind sehr nützlich, um Daten von Ansichten an Layout oder teilweise an Ansichten (oder ViewComponents usw.) zu übergeben. Sie sind nicht exklusiv für Controller.

Als Standardbeispiel für asp.net finden Sie dies auf der Layoutseite:

<title>@ViewData["Title"] - MyApp</title>

und in jeder Hinsicht

ViewData["Title"] = "Details";

Also, um die Frage zu stellen: "Was ist der Unterschied zwischen ViewBagundViewData ?"

Der bemerkenswerteste Unterschied ist ViewDataein stark typisiertes Wörterbuch, während ViewBages sich um einen dynamischen Typ handelt.

Beachten Sie, dass die darin enthaltenen Daten die gleichen sind

ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";

Wann soll man das eine oder andere benutzen?

  • ViewBagunterstützt keine ungültigen C # -Namen. Sie können nicht auf ViewData["Key With Space"]mitViewBag
  • ViewBag.Something ist dynamisch und es können Probleme beim Aufrufen von Methoden (wie Erweiterungsmethoden) auftreten, die den genauen Parameter zur Kompilierungszeit kennen müssen.
  • ViewBag kann nach syntaktischen Reinigern für Nullen suchen: ViewBag.Person?.Name
  • ViewDataHaben Sie alle Eigenschaften eines Wörterbuchs wie ContainsKey, Addetc., so dass Sie verwenden können ViewData.Add("somekey", "somevalue"), denken Sie daran, es könnte Ausnahmen auslösen.
  • Für die Verwendung ViewDatavon Ansichten ist TypeCasting erforderlich, ViewBagdies jedoch nicht.

Die subtilen Unterschiede zu kennen und das eine oder andere zu verwenden, ist viel mehr eine Geschmackspräferenz.

Normalerweise kann man ViewBag.AnyKeysich einen Alias ​​von vorstellenViewData["AnyKey"]


1
Dies sollte eine akzeptierte Antwort sein!
Prashant Pimpale

14

Kann ich Ihnen empfehlen, auch nicht zu verwenden?

Wenn Sie Daten an Ihren Bildschirm "senden" möchten, senden Sie ein stark typisiertes Objekt (AKA ViewModel), da es einfacher zu testen ist.

Wenn Sie an eine Art "Modell" binden und zufällige "viewbag" - oder "viewdata" -Elemente haben, ist das automatisierte Testen sehr schwierig.

Wenn Sie diese verwenden, überlegen Sie, wie Sie möglicherweise ViewModels umstrukturieren und einfach verwenden können.


4
Wenn Sie das Prinzip "Compiler ist der erste Komponententest" ignorieren, wie macht ein statisch typisiertes Ansichtsmodell Ihren Code testbarer als einen dynamischen Typ? Während die Anforderung an Tests in einer dynamisch typisierten Lösung wichtiger ist, verlieren Sie nichts, wenn beide Lösungen dieselbe Anzahl und Art von Tests implementieren.
Darren Lewis

Ich stimme zu, es ist ein wenig vage. Vielleicht ist Intellisense beteiligt.
Joshua Ramirez

1
Ein Beispiel wäre Spott. Wenn Sie eine Controller-Aktion einem Komponententest unterziehen möchten, ist es einfacher, ein "Schein" -Objekt zu erstellen, um es weiterzugeben und zu bestätigen, als zu behaupten, dass eine Zeichenfolge zu einem Wörterbuch hinzugefügt wurde oder ein dynamisches Feld auf einen bestimmten Wert festgelegt ist Ein ähnliches Konzept wie bei Serviceverträgen mit einem "Request" - und einem "Response" -Objekt, anstatt mehrere Parameter zu verwenden.
Nootn

Wie würden Sie Daten von Ansicht zu Layout übergeben, wenn Sie keine verwenden? -1
Bart Calixto

Wie ist das eine Antwort?
JSON


6

viewdata: ist ein Wörterbuch zum Speichern von Daten zwischen Ansicht und Controller. Sie müssen das Ansichtsdatenobjekt in das entsprechende Modell in der Ansicht umwandeln, um Daten daraus abrufen zu können ...

ViewBag: ist eine dynamische Eigenschaft, die in ihrer Arbeitsweise den Ansichtsdaten ähnelt. Es ist jedoch besser, da sie nicht in das entsprechende Modell umgewandelt werden muss, bevor sie in der Ansicht verwendet wird ...


4

Nachfolgend finden Sie den Punkt-zu-Punkt-Unterschied zu ViewData, ViewBag, TempData und Session. Credit / kopiert askforprogram.in , Folgen Sie dem Link für ein Codebeispiel, das ich hier nicht erwähnt habe.

  1. ViewData in MVC

    • ViewData ist eine Eigenschaft der ControllerBase-Klasse.
    • ViewData ist eine Art Wörterbuchobjekt.
    • ViewData ist eine Schlüsselwert-Wörterbuchsammlung.
    • ViewData wurde in der MVC 1.0-Version eingeführt.
    • ViewData funktioniert mit .NET Framework 3.5 und höher.
    • Während der Aufzählung muss der Code konvertiert werden.
    • Das ViewData-Objekt speichert Daten nur für die aktuelle Anforderung.
  2. ViewBag in MVC

    • ViewBag ist eine Eigenschaft der ControllerBase-Klasse.
    • ViewBag ist eine Art dynamisches Objekt.
    • ViewBag ist eine Art Objekt.
    • ViewBag wurde in der MVC 3.0-Version eingeführt.
    • ViewBag funktioniert mit .Net Framework 4.0 und höher.
    • ViewBag verwendet die Eigenschaft und behandelt sie, sodass beim Auflisten keine Typkonvertierung durchgeführt werden muss.
    • Das ViewBag-Objekt speichert Daten nur für die aktuelle Anforderung.
  3. TempData in MVC

    • TempData ist eine Eigenschaft der ControllerBase-Klasse.
    • TempData ist eine Art Wörterbuchobjekt.
    • TempData ist eine Schlüsselwert-Wörterbuchsammlung.
    • TempData wurde in der MVC 1.0-Version eingeführt.
    • TempData funktioniert mit .NET Framework 3.5 und höher.
    • Während der Aufzählung muss der Code konvertiert werden.
    • Das TempData-Objekt wird für Daten zwischen der aktuellen Anforderung und der nachfolgenden Anforderung verwendet.
  4. Sitzung in MVC

    • Die Sitzung ist Eigentum von Controller (Abstract Class).
    • Sitzung ist eine Art von HttpSessionStateBase.
    • Die Sitzung ist eine Schlüsselwert-Wörterbuchsammlung.
    • Die Sitzung wurde in der MVC 1.0-Version eingeführt.
    • TempData funktioniert mit .Net Framework 1.0 und höher.
    • Während der Aufzählung muss der Code konvertiert werden.
    • Das Sitzungsobjekt speichert Daten für alle Anforderungen. Gültig für alle Anfragen, läuft nie ab.

1

Obwohl Sie möglicherweise keinen technischen Vorteil bei der Auswahl eines Formats gegenüber dem anderen haben, sollten Sie sich einiger wichtiger Unterschiede zwischen den beiden Syntaxen bewusst sein. Ein offensichtlicher Unterschied besteht darin, dass ViewBag nur funktioniert, wenn der Schlüssel, auf den Sie zugreifen, eine gültige C # -Kennung ist. Wenn Sie beispielsweise einen Wert in ViewData ["Schlüssel mit Leerzeichen"] einfügen, können Sie mit ViewBag nicht auf diesen Wert zugreifen, da der Code nicht kompiliert werden kann. Ein weiteres wichtiges Problem ist, dass Sie keine dynamischen Werte als Parameter an Erweiterungsmethoden übergeben können. Der C # -Compiler muss zur Kompilierungszeit den tatsächlichen Typ jedes Parameters kennen, um die richtige Erweiterungsmethode auswählen zu können. Wenn ein Parameter dynamisch ist, schlägt die Kompilierung fehl. Beispielsweise schlägt dieser Code immer fehl: @ Html.TextBox ("name", ViewBag.Name). Um dies zu umgehen, verwenden Sie entweder ViewData ["Name"


0
public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}

public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
} 

In View:

@ViewBag.Name 
@ViewData["Name"] 

0

Auf diese Weise können wir die Werte verwenden, um die Informationen zwischen dem Controller mit TEMP DATA an eine andere Seite zu übergeben


0

Ein Hauptunterschied zwischen ViewData und ViewBag ist:

ViewData: Das Objekt wird zurückgegeben, unabhängig davon, was Sie diesem Objekt zugewiesen haben, und muss erneut auf den ursprünglichen Typ zurückgesetzt werden.

ViewBag: Es ist klug genug, den genauen Typ zurückzugeben, den Sie ihm zugewiesen haben. Es spielt keine Rolle, ob Sie einen einfachen Typ (z. B. int, string usw.) oder einen komplexen Typ zugewiesen haben.

Beispiel: Controller-Code.

 namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            Products p1 = new Products();
            p1.productId = 101;
            p1.productName = "Phone";
            Products p2 = new Products();
            p2.productId = 102;
            p2.productName = "laptop";

            List<Products> products = new List<Products>();
            products.Add(p1);
            products.Add(p2);
            ViewBag.Countries = products;
            return View();
        }
    }
    public class Products
    {
        public int productId { get; set; }
        public string productName { get; set; }
    }
}

Code anzeigen.

<ul>
            @foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
            {
            <li>@item.productId &nbsp;&nbsp;&nbsp;@item.productName</li>
            }
        </ul>

OutPut-Bildschirm.

Geben Sie hier die Bildbeschreibung ein


0

Daten anzeigen

  1. ViewData wird verwendet, um Daten vom Controller an die Ansicht zu übergeben
  2. ViewData wird von der ViewDataDictionary-Klasse abgeleitet und ist im Grunde ein Dictionary-Objekt, dh Schlüssel und Werte, wobei Schlüssel Zeichenfolgen sind, während Werte Objekte sind.
  3. Das Abrufen von Daten ist beim Abrufen der Daten aus ViewData aufgrund des Objektdatentyps und der Überprüfung des Nullwertwerts vor dem Typumwandeln erforderlich, da sonst die Anwendung beschädigt wird. Wenn eine Umleitung erfolgt, wird der Wert null. Lesen Sie die vollständige Differenz zwischen TempData ViewData und View Bag

http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html


0
Daten anzeigen
  1. ViewData wird verwendet, um Daten vom Controller an die Ansicht zu übergeben
  2. Es wird von der ViewDataDictionary-Klasse abgeleitet
  3. Es ist nur für die aktuelle Anfrage verfügbar
  4. Erfordert Typisierung für komplexe Datentypen und sucht nach Nullwerten, um Fehler zu vermeiden
  5. Wenn eine Umleitung erfolgt, wird der Wert null
ViewBag
  1. ViewBag wird auch verwendet, um Daten von der Steuerung an die jeweilige Ansicht zu übergeben
  2. ViewBag ist eine dynamische Eigenschaft, die die neuen dynamischen Funktionen in C # 4.0 nutzt
  3. Es ist auch nur für die aktuelle Anfrage verfügbar
  4. Wenn eine Umleitung erfolgt, wird der Wert null
  5. Erfordert keine Typumwandlung für komplexe Datentypen

0

Hier werden sowohl ViewData als auch ViewBag verwendet, um Daten vom Controller an View zu übergeben .

1. ViewData

- ViewData ist ein Wörterbuchobjekt, das von ViewDataDictonary abgeleitet ist Klasse .

- Daten erlauben nur eine Anforderung. ViewData-Werte werden gelöscht, wenn eine Seitenumleitung erfolgt.

- Der ViewData-Wert muss vor der Verwendung mit cate eingegeben werden.

Beispiel: In Controller

public ActionResult PassingDatatoViewWithViewData()
{
      ViewData["Message"] = "This message shown in view with the ViewData";
      return View();
}

Im Hinblick auf

@ViewData["Message"];

- Mit ViewData ist ein Paar wie Schlüssel und Wert , Nachricht ist Schlüssel und in ist Wert.

- Daten sind einfach, daher können wir hier keine Typumwandlung verwenden, wenn die Daten komplex sind, und dann Typumwandlung verwenden.

public ActionResult PassingDatatoViewWithViewData()
{
      var type= new List<string>
    {
        "MVC",
        "MVP",
        "MVVC"
    };
    ViewData["types"] = type;
    return View();
}

- In View können Daten als extrahiert werden

<ul>
        @foreach (var items in (List<string>)ViewData["types"])
        {
         <li>@items</li>
        }
  </ul>

2. ViewBag

--ViewBag verwendet die dynamische Funktion. ViewBag-Wrapper um die ViewData.

- In ViewBag ist ein Casting erforderlich.

- Wie ViewData, wenn die Umleitung erfolgt, wird der Wert null.

Beispiel:

public ActionResult PassingDatatoViewWithViewBag()
{
          ViewData.Message = "This message shown in view with the ViewBag";
          return View();
}

Im Hinblick auf

@ViewBag.vbMessage

- Verwenden Sie für komplexe Typen ViewBag

public ActionResult PassingDatatoViewWithViewBag()
{
          var type= new List<string>
        {
            "MVC",
            "MVP",
            "MVVC"
        };
        ViewBag.types = type;
        return View();
 }

- In View können Daten als extrahiert werden

<ul>
       @foreach (var items in ViewBag.types)
       {
         <li>@items</li>
       }
</ul>

- Der Hauptunterschied besteht darin, dass ViewBag keine Typumwandlung erfordert, ViewData jedoch eine Typumwandlung .


-1

ViewBag und ViewData sind zwei Mittel, mit denen Informationen vom Controller an die Ansicht in ASP.Net MVC übergeben werden. Das Ziel der Verwendung beider Mechanismen besteht darin, die Kommunikation zwischen Controller und View bereitzustellen. Beide haben eine kurze Lebensdauer, dh der Wert von beiden wird null, sobald die Umleitung erfolgt ist, dh sobald die Seite von der Quellseite (wo wir den Wert von ViewBag oder ViewData festlegen) auf die Zielseite umgeleitet wurde, sowohl ViewBag als auch ViewData wird null.

Trotz dieser Ähnlichkeiten sind beide (ViewBag und ViewData) zwei verschiedene Dinge, wenn wir über die Implementierung von beiden sprechen. Die Unterschiede sind wie folgt:

1.) Wenn wir beide Implementierungsmethoden analysieren, werden wir feststellen, dass ViewData eine Wörterbuchdatenstruktur ist - ein Wörterbuch der Objekte, das von ViewDataDictionary abgeleitet ist und über Zeichenfolgen als Schlüssel für diese Werte zugänglich ist, während ViewBag die in C # 4.0 und C # 4.0 eingeführten dynamischen Funktionen verwendet ist eine dynamische Eigenschaft.

2.) Während wir auf die Werte von ViewData zugreifen, müssen wir die Werte (Datentypen) typisieren, da sie als Objekte im ViewData-Wörterbuch gespeichert sind. Es besteht jedoch keine solche Notwendigkeit, wenn wir im Fall von ViewBag auf den Wert zugreifen.

3.) In ViewBag können wir den Wert wie folgt einstellen:

      ViewBag.Name = "Value"; 

und kann wie folgt zugreifen:

          @ViewBag.Name

Im Fall von ViewData können die Werte wie folgt festgelegt und aufgerufen werden: Festlegen von ViewData wie folgt:

ViewData["Name"] = "Value";

und Zugriff auf Wert wie diesen

 @ViewData["Name"] 

Für weitere Details klicken Sie hier:


2
Es tut mir leid, dass ich abgelehnt habe, aber diese Antwort braucht mehrere Absätze, um nichts Nützliches zu sagen. Das Nützliche, was in der akzeptierten Antwort fehlt, wäre der Satz "viewbag ist ein dynamischer Wrapper um viewdata", den ich von rachelappel.com/…
Chris F Carroll am
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.