asp.net-mvc
ViewData, ViewBag, TempData
Suche…
Einführung
ViewData
und ViewBag
werden verwendet, um Daten vom Controller zur Ansicht zu übertragen.
ViewData ist nichts anderes als ein Wörterbuch von Objekten und es ist als Schlüssel über eine Zeichenkette zugänglich.
ViewBag ist sehr ähnlich zu ViewData. ViewBag ist eine dynamische Eigenschaft. ViewBag ist nur ein Wrapper um ViewData.
TempData speichert Daten für die Zeit der HTTP-Anforderung, d. H. Es speichert Daten zwischen zwei aufeinander folgenden Anforderungen. TempData hilft uns, Daten zwischen Steuerungen oder zwischen Aktionen zu übertragen. Verwendet intern Sitzung.
Syntax
ViewData [Schlüssel] = Wert;
ViewBag.Key = Wert;
TempData [Schlüssel] = Wert;
Was sind ViewData, ViewBag und TempData?
ViewData ist der Mechanismus, mit dem ein Controller der Ansicht, die er darstellt, Daten zur Verfügung stellt, ohne ein ViewModel zu verwenden. Bei ViewData handelt es sich insbesondere um ein Wörterbuch, das sowohl in MVC-Aktionsmethoden als auch in Ansichten verfügbar ist. Sie können ViewData verwenden, um einige Daten von Ihrer Aktionsmethode in die von der Aktionsmethode zurückgegebene Ansicht zu übertragen.
Da es sich um ein Wörterbuch handelt, können Sie die wörterbuchartige Syntax verwenden, um Daten festzulegen und abzurufen.
ViewData[key] = value; // In the action method in the controller
Wenn Sie beispielsweise eine Zeichenfolgenachricht von Ihrer Index.cshtml
an Ihre Index.cshtml
, können Sie dies tun.
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC";
return View(); // notice the absence of a view model
}
Um darauf in Ihrer Index.cshtml
Ansicht Index.cshtml
, können Sie einfach mit dem in der Aktionsmethode verwendeten Schlüssel auf das ViewData-Wörterbuch zugreifen.
<h2>@ViewData["Message"]</h2>
ViewBag ist die dynamische Entsprechung des nicht typisierten ViewData-Wörterbuchs. Es nutzt den dynamic
Typ C # für das syntaktische Zuckererlebnis.
Die Syntax zum Festlegen einiger Daten für ViewBag lautet
ViewBag.Key = Value;
Wenn wir also die Nachrichtenzeichenfolge in unserem vorherigen Beispiel mit ViewBag übergeben möchten, ist dies der Fall
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC";
return View(); // not the absence of a view model
}
und in Ihrer Indexansicht
<h2>@ViewBag.Message</h2>
Daten werden nicht zwischen ViewBag und ViewData gemeinsam genutzt. ViewData erfordert eine Typumwandlung, um Daten aus komplexen Datentypen abzurufen, und sucht nach Nullwerten, um Fehler zu vermeiden, bei denen für View Bag keine Typumwandlung erforderlich ist.
TempData kann verwendet werden, wenn Sie Daten zwischen einer http-Anforderung und nur der nächsten HTTP-Anforderung beibehalten möchten. Die Lebensdauer der im TempDataDictionary gespeicherten Daten endet nach der zweiten Anforderung. Daher ist TempData in Szenarien hilfreich, in denen Sie dem PRG-Muster folgen.
[HttpPost]
public ActionResult Create(string name)
{
// Create a user
// Let's redirect (P-R-G Pattern)
TempData["Message"] = "User created successfully";
return RedirectToAction("Index");
}
public ActionResult Index()
{
var messageFromPreviousCall = TempData["Message"] as String;
// do something with this message
// to do : Return something
}
Wenn wir return RedirectToAction("SomeActionMethod")
, sendet der Server eine 302-Antwort an den Client (Browser), wobei der Ortsheaderwert auf die URL "SomeActionMethod" gesetzt ist, und der Browser stellt eine völlig neue Anforderung. ViewBag / ViewData funktioniert in diesem Fall nicht, um Daten zwischen diesen beiden Aufrufen zu teilen. In solchen Szenarien müssen Sie TempData verwenden.
TempData-Lebenszyklus
In TempData gespeicherte Daten werden in der Sitzung gespeichert und am Ende der ersten Anforderung, auf die auf die Daten zugegriffen wird, automatisch entfernt. Wenn es nie gelesen wird, wird es aufbewahrt, bis es endgültig gelesen wird oder die Sitzung abgelaufen ist.
Die typische Verwendung sieht wie folgt aus (wobei jede Zeile von einer anderen Anforderung aus aufgerufen wird):
//first request, save value to TempData
TempData["value"] = "someValueForNextRequest";
//second request, read value, which is marked for deletion
object value = TempData["value"];
//third request, value is not there as it was deleted at the end of the second request
TempData["value"] == null
Dieses Verhalten kann mit den Peek
und Keep
Methoden weiter gesteuert werden.
Mit
Peek
Sie in TempData gespeicherte Daten abrufen, ohne sie zum Löschen zu markieren, sodass die Daten für eine zukünftige Anforderung weiterhin verfügbar sind//first request, save value to TempData TempData["value"] = "someValueForNextRequest"; //second request, PEEK value so it is not deleted at the end of the request object value = TempData.Peek("value"); //third request, read value and mark it for deletion object value = TempData["value"];
Mit
Keep
Sie festlegen, dass ein zum Löschen markierter Schlüssel tatsächlich beibehalten werden soll. In diesem Fall erfordert das Abrufen der Daten und das Speichern vor dem Löschen 2 Methodenaufrufe://first request, save value to TempData TempData["value"] = "someValueForNextRequest"; //second request, get value marking it from deletion object value = TempData["value"]; //later on decide to keep it TempData.Keep("value"); //third request, read value and mark it for deletion object value = TempData["value"];
Verwenden Sie zu diesem Zweck Peek
wenn Sie immer den Wert für eine andere Anforderung beibehalten möchten, und Keep
wenn der Wert beibehalten wird, von zusätzlicher Logik abhängig.