Ich sah die ViewBag
in MVC 3. Was ist der Unterschied zu ViewData
in MVC 2?
Antworten
Zu viele Anzeigen?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.
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.)
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"]
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 aufViewData["Key With Space"]
conViewBag
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 wieContainsKey
,Add
usw., so dass Sie Folgendes verwenden könnenViewData.Add("somekey", "somevalue")
beachten Sie, dass es zu Ausnahmen kommen kann.- 使用する
ViewData
auf Ansichten erfordert TypeCasting, währendViewBag
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"]
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>
- See previous answers
- Weitere Antworten anzeigen