Ich habe das ViewBag
in MVC 3 gesehen. Wie ist das anders als ViewData
in MVC 2?
Ich habe das ViewBag
in MVC 3 gesehen. Wie ist das anders als ViewData
in MVC 2?
Antworten:
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.
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.)
ViewData
und ViewBag
nicht nach ViewModel
.
dynamic
und unterstützt ViewBag.Message
. Man benutzt die alte ViewData["Message"]
Syntax.
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"]
typecasting
aber Sie haben nicht gezeigt, wie Typografie durchgeführt wird
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 View
lautet 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>
<h4>@ViewBag.emp.Name</h4>
sollte sich ändern zu<h4>@ViewBag.Employee.Name</h4>
Alle Antworten legen nahe, dass ViewBag
und / oder ViewData
Daten von Controller
an ü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 ViewBag
undViewData
?"
Der bemerkenswerteste Unterschied ist ViewData
ein stark typisiertes Wörterbuch, während
ViewBag
es 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?
ViewBag
unterstü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
ViewData
Haben Sie alle Eigenschaften eines Wörterbuchs wie ContainsKey
, Add
etc., so dass Sie verwenden können ViewData.Add("somekey", "somevalue")
, denken Sie daran, es könnte Ausnahmen auslösen.ViewData
von Ansichten ist TypeCasting erforderlich, ViewBag
dies jedoch nicht.Die subtilen Unterschiede zu kennen und das eine oder andere zu verwenden, ist viel mehr eine Geschmackspräferenz.
Normalerweise kann man ViewBag.AnyKey
sich einen Alias von vorstellenViewData["AnyKey"]
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.
Es gibt einige subtile Unterschiede, die bedeuten, dass Sie ViewData und ViewBag auf etwas andere Weise als in der Ansicht verwenden können. Ein Vorteil wird in diesem Beitrag http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx beschrieben und zeigt dieses Casting kann im Beispiel vermieden werden, indem ViewBag anstelle von ViewData verwendet wird.
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 ...
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.
ViewData in MVC
ViewBag in MVC
TempData in MVC
Sitzung in MVC
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"
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
In View:
@ViewBag.Name
@ViewData["Name"]
Auf diese Weise können wir die Werte verwenden, um die Informationen zwischen dem Controller mit TEMP DATA an eine andere Seite zu übergeben
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 @item.productName</li>
}
</ul>
OutPut-Bildschirm.
Daten anzeigen
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
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 .
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: