Ich sah die ViewBag
in MVC 3. Wie ist das anders als ViewData
in MVC 2?Was ist der Unterschied zwischen ViewData und ViewBag?
Antwort
Es verwendet die dynamische C# 4.0-Funktion. Es erreicht dasselbe Ziel wie viewdata und sollte zugunsten stark typisierter View-Modelle vermieden werden (genauso wie viewdata vermieden werden sollte).
Also im Grunde ersetzt es Magie Saiten:
ViewData["Foo"]
mit magischen Eigenschaften:
ViewBag.Foo
für die Sie keine Kompilierung Sicherheit haben.
Ich bin weiterhin verantwortlich für Microsoft für die Einführung dieses Konzepts in MVC.
Beim Namen der Eigenschaften wird zwischen Groß- und Kleinschreibung unterschieden.
Es gibt einige feine Unterschiede, die bedeuten, dass Sie ViewData und ViewBag auf eine etwas andere Weise als in der Ansicht verwenden können. Ein Vorteil ist in diesem Post http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx umrissen und zeigt, dass Casting in dem Beispiel vermieden werden kann, indem ViewBag anstelle von ViewData verwendet wird.
Intern ViewBag Eigenschaften werden als Name/Wert-Paare in dem WörterbuchViewdata gespeichert.
Hinweis: in den meist Pre-Release-Versionen von MVC 3 wurde die ViewBag Eigenschaft, um das Ansichtsmodell genannt, wie in diesem Ausschnitt aus MVC 3 Release Notes festgestellt:
(herausgegeben 10-8-12) Es war vorgeschlagen, dass ich die Quelle dieser Informationen, die ich geschrieben posten, ist hier die Quelle: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4
MVC 2-Controller eine Viewdata Eigenschaft unterstützen, die Sie Daten zu übergeben zu einer Ansichtsvorlage mit einer spät gebundenen dictiona ermöglicht ry API. In MVC 3 können Sie auch etwas einfachere Syntax mit der ViewBag-Eigenschaft verwenden, um den gleichen Zweck zu erreichen . Zum Beispiel, statt schreiben ViewData ["Message"] = "Text", können Sie ViewBag.Message = "Text" schreiben. Sie müssen stark typisierte Klassen nicht definieren, um die ViewBag-Eigenschaft zu verwenden. Da es sich um eine dynamische Eigenschaft handelt, können Sie stattdessen nur Eigenschaften abrufen oder festlegen, und sie werden zur Laufzeit dynamisch aufgelöst ( ). Intern sind die ViewBag-Eigenschaften als Name/Wert-Paare im ViewData-Verzeichnis gespeichert. (Anmerkung: in den meisten Pre-Release-Versionen von MVC 3, die ViewBag Eigenschaft genannt wurde die Ansichtsmodell Eigenschaft.)
Die Frage fragt nach dem Unterschied zwischen 'ViewData' und' ViewBag', nicht nach 'ViewModel'. –
Danke für das Heads-Up Matthew Flaschen, ich hatte einen Tippfehler in der Antwort und reparierte es, jetzt liest "ViewData" statt ViewModel was ein Fehler war. :) –
Jetzt ist es falsch. Keine wurde in die andere umbenannt. Sie existieren beide noch. Eins ist 'dynamisch' und unterstützt' ViewBag.Message'. Man benutzt die alte 'ViewData [" Message "]' Syntax. –
Kann ich Ihnen empfehlen, auch nicht zu benutzen?
Wenn Sie Daten an Ihren Bildschirm senden möchten, senden Sie ein stark typisiertes Objekt (A.K.A. ViewModel), weil es einfacher zu testen ist.
Wenn Sie an eine Art "Modell" binden und zufällige "viewbag" - oder "viewdata" -Einträge haben, wird das automatisierte Testen sehr schwierig.
Wenn Sie diese verwenden, überlegen Sie, wie Sie möglicherweise restrukturieren und ViewModels verwenden können.
Ignorieren des Principals "Compiler ist der erste Komponententest" Wie macht ein statisch typisiertes View-Modell Ihren Code testbarer als einen dynamischen Typ? Während die Anforderung für Tests in einer dynamisch typisierten Lösung wichtiger ist, verlieren beide Lösungen nichts, wenn beide Lösungen die gleiche Anzahl und Art von Tests implementieren. –
Ich stimme zu, es ist ein wenig vage. Vielleicht ist Intellisense beteiligt. –
Ein Beispiel wäre Spott. Wenn Sie eine Controller-Aktion testen möchten, ist es einfacher, ein "Mock" -Objekt zu erstellen, um es zu übergeben und zu bestätigen, anstatt zu versuchen, zu bestätigen, dass ein String zu einem bestimmten Wert hinzugefügt wurde ein ähnliches Konzept, um Verträge mit einem "Anfrage" - und einem "Antwort" -Objekt zu bedienen, anstatt mehrere Parameter zu verwenden. – nootn
ViewData
: Typumwandlung für komplexen Datentyp erforderlich, und auf Nullwerte prüfen, um Fehler zu vermeiden.
ViewBag
: Es erfordert keine Typumwandlung für komplexe Datentypen.
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.emp.Name</h4>
<h3>@viewDataEmployee.Name</h3>
hilf mir zu verstehen, aber ich denke, es ist ein Fehler. Dieses '
@ ViewBag.emp.Name
' sollte@ ViewBag.Employee.Name
' –ViewBag vs Viewdata in MVC
http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html
Ähnlichkeiten zwischen ViewBag & Viewdata:
Helfen Daten zu erhalten, wenn Sie von der Steuerung bewegen zu können. Verwendet, um Daten vom Controller an die entsprechende Ansicht zu übergeben. Kurze Lebensdauer bedeutet Wert wird Null, wenn Umleitung auftritt. Dies liegt daran, dass ihr Ziel eine Möglichkeit zur Kommunikation zwischen Controllern und Ansichten bietet. Es ist ein Kommunikationsmechanismus innerhalb des Serveraufrufs.
Unterschied zwischen ViewBag & Viewdata:
Viewdata ist ein Wörterbuch von Objekten, die von Viewdatadictionary Klasse und zugänglich mit Strings als Schlüssel abgeleitet wird. ViewBag ist eine dynamische Eigenschaft, die die neuen dynamischen Features in C# 4.0 nutzt. ViewData erfordert Typecasting für komplexe Datentypen und überprüfen auf Nullwerte, um Fehler zu vermeiden. ViewBag erfordert Typecasting für komplexen Datentyp nicht.
ViewBag & Viewdata Beispiel:
public ActionResult Index()
{
ViewBag.Name = "Arun Prakash";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Arun Prakash";
return View();
}
in Ansicht aufrufen
@ViewBag.Name
@ViewData["Name"]
Ihre Antwort auf' 'ändern typecasting' zeigen, aber sie nicht zeigen, wie eine Schublade gesteckt durchgeführt wird – Alex
Bildschirmtextsystem: ein Wörterbuch zum Speichern von Daten zwischen View und Controller verwendet wird, u müssen gegossen das View-Datenobjekt zu seinem entsprechenden Modell in der Ansicht, um Daten von ihm abrufen zu können ...
ViewBag: ist eine dynamische Eigenschaft ähnlich in ihrem Arbeits der Ansichtsdaten, aber es ist besser, Cuz es nicht vor seinem corressponding Modell gegossen werden muss es in der Ansicht mit ...
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
In View:
@ViewBag.Name
@ViewData["Name"]
ViewBag und ViewData sind zwei Mittel, die verwendet werden, um Informationen vom Controller zur Anzeige in ASP.Net MVC zu übergeben. 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 wird, 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 Implementierung weise analysieren, dann werden wir feststellen, dass ViewData eine Wörterbuchdatenstruktur - Dictionary of Objects abgeleitet von ViewDataDictionary und zugänglich mit Strings als Schlüssel zu diesen Werten, während ViewBag verwendet der dynamischen Features, die in C# 4.0 eingeführt wurden, und ist eine dynamische Eigenschaft.
2.) Beim Zugriff auf die Werte von ViewData müssen wir die Werte (Datentypen) wie sie im ViewData Dictionary als Objekte gespeichert sind eingeben, aber es gibt keine Notwendigkeit, wenn wir im Falle von ViewBag auf diesen Wert zugreifen.
3.) In ViewBag wir den Wert wie folgt festlegen:
ViewBag.Name = "Value";
und zugreifen können wie folgt:
@ViewBag.Name
Während bei Viewdata können die Werte eingestellt werden und der Zugriff als folgt: Einstellung Bildschirmtextsystem wie folgt:
ViewData["Name"] = "Value";
und Wert li Zugriff ke diesen
@ViewData["Name"]
Weitere Details click here:
sorry ich aber diese Antwort Downvoted nimmt mehrere Absätze um nichts nützliches zu sagen. Das nützliche Ding, das von der angenommenen Antwort fehlt, würde der Satz sein "viewbag ist ein dynamischer Wrapper um viewdata", den ich von http://rachelappel.com/when-to-use-viewbag-viewdata-atur-tempdata-in-asp erfuhr .net-mvc-3-Anwendungen –
Auf diese Weise können wir die Werte an die die Informationen zwischen dem Controller auf andere Seite mit TEMP DATA Pass verwenden
Alle Antworten deuten darauf hin, dass ViewBag
und/oder ViewData
Daten von Controller
an Views
weiterzuleiten, was Fehlinformationen ist.Beide sind sehr nützlich, um Daten von Views zu Layout oder Partial zu Views (oder ViewComponents, etc.) zu übergeben. Es ist nicht Controller-exklusiv.
als Standard asp.net Probe hat dies in der Layoutseite:
<title>@ViewData["Title"] - MyApp</title>
und in jeder Ansicht
ViewData["Title"] = "Details";
Also, die Frage zu stellen: „Was ist der Unterschied zwischen ViewBag
und ViewData
? "
Der bemerkenswerteste Unterschied ist ViewData
ist ein stark typisiertes Wörterbuch, während ViewBag
ein dynamischer Typ ist.
Beachten Sie, dass die Daten innerhalb Das gleiche
ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";
Wenn das eine oder andere benutzen?
ViewBag
unterstützt keine ungültigen C# -Namen. Sie können nicht ViewData["Key With Space"]
Zugriff mit ViewBag
ViewBag.Something
ist dynamisch und Sie können Probleme haben, wenn Methoden aufrufen (wie Erweiterungsmethoden), die die genauen Parameter bei der Kompilierung wissen muss.ViewBag
für nulls syntaktische Reiniger überprüfen: ViewBag.Person?.Name
ViewData
haben alle die Eigenschaften eines Dictionary wie ContainsKey
, Add
etc., so dass Sie ViewData.Add("somekey", "somevalue")
im Auge behalten können es Ausnahmen auslösen könnten.ViewData
auf Ansichten benötigt TypeCasting während ViewBag
nicht.Die subtilen Unterschiede zu kennen, die Verwendung der einen oder anderen ist viel mehr eine Geschmacksvorliebe.
Normalerweise kann man sich vorstellen ViewBag.AnyKey
zu einem Alias von ViewData["AnyKey"]
Obwohl Sie keinen technischen Vorteil der Wahl für ein bestimmtes Format das andere haben könnte, sollten Sie zwischen den beiden Syntaxen bewusst einige wichtige Unterschiede. Ein offensichtlicher Unterschied besteht darin, dass ViewBag nur funktioniert, wenn der Schlüssel, auf den Sie zugreifen, ein gültiger C# -Benutzer ist. Wenn Sie beispielsweise einen Wert in ViewData ["Key With Spaces"] setzen, können Sie nicht mit ViewBag auf diesen Wert zugreifen, da der Code nicht kompiliert wird. Ein weiteres zu berücksichtigendes Schlüsselproblem ist, dass Sie keine dynamischen Werte als Parameter an Erweiterungsmethoden übergeben können. Der C# -Compiler muss den echten Typ jedes -Parameters zum Zeitpunkt der Kompilierung kennen, um die richtige Erweiterungsmethode auswählen zu können. Wenn ein Parameter dynamisch ist, schlägt die Kompilierung fehl. Zum Beispiel wird dieser Code immer fehlschlagen: @ Html.TextBox ("name", ViewBag.Name).Um dies zu umgehen, entweder Verwendung Viewdata [ „Name“] oder werfen die va
Ein Hauptunterschied ich zwischen Viewdata und ViewBag bemerkt ist:
Viewdata: es wird wieder Objekt ist egal, was Sie zugeordnet haben in diese und müssen wieder auf den ursprünglichen Typ zurückschreiben.
ViewBag: Es ist genug smart, um genau den Typ zurückzugeben, was Sie ihm zugewiesen haben, es spielt keine Rolle, ob Sie einen einfachen Typ (d. H. Int, String usw.) oder einen komplexen Typ zugewiesen haben.
Beispiel: Steuerungscode.
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 @item.productName</li>
}
</ul>
Ausgabebildschirm.
View Data
- Bildschirmtextsystem wird verwendet, um Daten von der Steuereinheit passieren anzuzeigen
- Viewdata aus der Klasse Viewdatadictionary abgeleitet und ist im Prinzip ein Dictionary Objekt ieKeys und Werte Schlüssel sind String, während Werte Objekte sind.
- Daten Typcasting ist erforderlich beim Abrufen der Daten von ViewData wegen seiner Objekttyp von Daten und Null-Vvalue-Check vor Typ Casting, sonst wird es die Anwendung zu brechen. Wenn Umleitung auftritt, dann wird ihr Wert wird null Lesen Sie die vollständige Differenz zwischen TempData Viewdata und View-Tasche
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
zu welchem Zweck Sie Microsoft die Schuld? Wenn keine Viewdaten vorhanden sind, wie können wir die Dropdownliste vom Modell binden. (Ich denke nicht, dass die Verwendung von selectlist im Modell eine gute Idee wäre) –
@SubinJacob Sie sollten wirklich eine neue Frage stellen, wenn Sie eine Antwort darauf wollen. Das Erstellen einer SelectList ist definitiv der Weg zu einer Dropdown-Liste. – MiniRagnarok
@SubinJacob, ich nehme an, er beschuldigt MS für die Einführung der dynamischen Funktionen. – MEMark