366 Stimmen

Was ist der Unterschied zwischen ViewData und ViewBag?

Ich sah die ViewBag in MVC 3. Was ist der Unterschied zu ViewData in MVC 2?

409voto

Darin Dimitrov Punkte 990883

Es verwendet die dynamische Funktion von C# 4.0. Es erreicht das gleiche Ziel wie viewdata und sollte zugunsten der Verwendung von stark typisierten View-Modellen vermieden werden (genauso wie viewdata vermieden werden sollte).

Sie ersetzt also im Wesentlichen Zauberfäden :

ViewData["Foo"]

con magische Eigenschaften :

ViewBag.Foo

für die Sie keine Kompilierzeitsicherheit haben.

Ich gebe Microsoft weiterhin die Schuld dafür, dass dieses Konzept überhaupt in MVC eingeführt wurde.

Bei den Namen der Eigenschaften wird zwischen Groß- und Kleinschreibung unterschieden.

42voto

Rich Bianco Punkte 4041

Intern ViewBag Eigenschaften werden als Name/Wert-Paare in der ViewData-Wörterbuch .

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

(bearbeitet 10-8-12) Es wurde vorgeschlagen, dass ich die Quelle dieser Information, die ich gepostet habe, hier bekannt gebe: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4

MVC 2-Controller sup Eigenschaft, die es Ihnen ermöglicht, Daten an ein View-Template mit Hilfe eines spät gebundenen Wörterbuch-API. In MVC 3, können Sie auch eine etwas einfachere Syntax mit der ViewBag-Eigenschaft verwenden, um den gleichen Zweck zu erreichen. Zum Beispiel, anstelle von ViewData["Nachricht"]="Text" zu schreiben, können Sie ViewBag.Message="text" schreiben. Sie müssen keine stark typisierte Klassen definieren, um die ViewBag-Eigenschaft zu verwenden. Da es sich um eine dynamische Eigenschaft ist, können Sie stattdessen einfach get oder set Eigenschaften und es wird dynamisch zur Laufzeit aufgelöst werden. Intern werden die ViewBag-Eigenschaften als Name/Wert Paare in der ViewData Wörterbuch gespeichert. [ ] Vorabversionen von MVC 3, wurde die ViewBag Eigenschaft den Namen ViewModel-Eigenschaft.)

40voto

Arun Prakash Punkte 850

ViewBag vs. ViewData in MVC

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

Ähnlichkeiten zwischen ViewBag und ViewData :

Hilft bei der Beibehaltung von Daten, wenn Sie vom Controller zur Ansicht wechseln. Verwendet um Daten vom Controller an den entsprechenden View zu übergeben. Kurze Lebensdauer bedeutet Wert wird null, wenn die Umleitung erfolgt. Dies liegt daran, dass ihr Ziel ist, einen Weg zur Kommunikation zwischen Controllern und Views zu bieten. Es ist ein Kommunikationsmechanismus innerhalb des Serveraufrufs.

Unterschied zwischen ViewBag und ViewData:

ViewData ist ein Wörterbuch von Objekten, das sich von ViewDataDictionary Klasse abgeleitet ist und über Strings als Schlüssel zugänglich ist. ViewBag ist eine dynamische Eigenschaft, die die Vorteile der neuen dynamischen Funktionen in C# 4.0 nutzt. ViewData erfordert Typecasting für komplexe Datentypen und Prüfung auf Nullwerte, um Fehler zu vermeiden. ViewBag erfordert keine Typecasting 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();
}   

Aufruf in der Ansicht

@ViewBag.Name    
@ViewData["Name"]

37voto

Bart Calixto Punkte 18546

Alle Antworten deuten darauf hin, dass ViewBag und/oder ViewData ist die Weitergabe von Daten von Controller a Views was eine Fehlinformation ist. Beide sind sehr nützlich, um Daten von Views zu Layout oder Partial zu Views (oder ViewComponents, etc.) weiterzugeben Es ist nicht Controller exklusiv.

da das Standard-Asp.net-Beispiel dies in der Layout-Seite hat:

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

und in jeder Ansicht

ViewData["Title"] = "Details";

Also, um die Frage zu stellen: "Was ist der Unterschied zwischen ViewBag y ViewData ?"

Der auffälligste Unterschied ist ViewData ist ein Strongly Typed Dictionary, während ViewBag ist ein dynamischer Typ.

Beachten Sie, dass die Daten in IST DAS GLEICHE

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

Wann sollte man das eine oder das andere verwenden?

  • ViewBag unterstützt keine ungültigen C#-Namen. Sie können nicht auf ViewData["Key With Space"] con ViewBag
  • ViewBag.Something dynamisch ist und Sie Probleme haben können, wenn Sie Methoden (wie Erweiterungsmethoden) aufrufen, die den genauen Parameter zur Kompilierungszeit kennen müssen.
  • ViewBag kann syntaktisch sauberer auf Nullen prüfen: ViewBag.Person?.Name
  • ViewData haben alle Eigenschaften eines Dictionarys wie ContainsKey , Add usw., so dass Sie Folgendes verwenden können ViewData.Add("somekey", "somevalue") beachten Sie, dass es zu Ausnahmen kommen kann.
  • 使用する ViewData auf Ansichten erfordert TypeCasting, während ViewBag nicht.

Wenn man die feinen Unterschiede kennt, ist die Verwendung des einen oder anderen eher eine Geschmacksfrage.

Normalerweise können Sie sich vorstellen ViewBag.AnyKey zu einem Alias von ViewData["AnyKey"]

37voto

Naresh Ravlani Punkte 1538

ViewData : Für komplexe Datentypen ist ein Typ-Casting erforderlich, und zur Vermeidung von Fehlern wird auf Nullwerte geprüft.

ViewBag : Für komplexe Datentypen ist kein Typ-Casting 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 View ist 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>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X