Unterschied zwischen ViewData und TempData?

94

Ich weiß, was ViewData ist und benutze es ständig, aber in ASP.NET Preview 5 wurde etwas Neues namens TempData eingeführt.

Normalerweise tippe ich meine ViewData stark ein, anstatt den Ansatz des Objektwörterbuchs zu verwenden.

Wann sollte ich TempData anstelle von ViewData verwenden?

Gibt es dafür Best Practices?

Elijah Manor
quelle
Ich möchte TempDatahier etwas hinzufügen stackoverflow.com/a/17199709/2015869
Imad Alazani

Antworten:

94

In einem Satz: TempDatasind wie ViewData mit einem Unterschied: Sie enthalten nur Daten zwischen zwei aufeinanderfolgenden Anforderungen, danach werden sie zerstört. Sie können TempDatadamit Fehlermeldungen oder ähnliches übergeben.

Obwohl veraltet, enthält dieser Artikel eine gute Beschreibung des TempDataLebenszyklus.

Wie Ben Scheirman hier sagte :

TempData ist ein sitzungsgestütztes temporäres Speicherwörterbuch, das für eine einzelne Anforderung verfügbar ist. Es ist großartig, Nachrichten zwischen Controllern zu übertragen.

Dragan Panjkov
quelle
Ich denke, das ist ein ziemlich großer Unterschied, da TempDataes sich um etwas handelt, das möglicherweise viel komplizierter ist (die Sitzung) als ein einfaches Wörterbuch, das von Methode zu Methode weitergegeben wird
Matti Virkkunen,
29

Wenn eine Aktion ein RedirectToAction-Ergebnis zurückgibt, verursacht sie eine HTTP-Umleitung (entspricht Response.Redirect). Daten können in der TempData-Eigenschaft (Wörterbuch) des Controllers für die Dauer einer einzelnen HTTP-Umleitungsanforderung gespeichert werden.

Captain Sensible
quelle
Wird der Wert von ViewData im selben Fall beibehalten?
IsmailS
9
@Ismail: Nein, ViewData speichert keine Daten über Redirect. Das ist der Hauptunterschied von TempData.
Mariano Desanze
5

Daten anzeigen:

  • ViewData ist ein Wörterbuchtyp public ViewDataDictionary ViewData { get; set; }
  • Es kann verwendet werden, um Daten vom Controller nur in eine Richtung an die Ansicht zu übergeben
  • Das Leben liegt nur während der aktuellen Anfrage
  • Wenn Sie eine Zeichenfolge übergeben, müssen Sie keine Typumwandlung durchführen
  • Wenn Sie ein Objekt übergeben, müssen Sie es typisieren, aber vorher müssen Sie überprüfen, ob es nicht null ist
  • Es ist eine Eigenschaft auf ControllerBase, die das Elternteil der ControllerKlasse ist

TempData:

  1. TempDataintern verwenden TempDataDictionary:public TempDataDictionary TempData { get; set; }
  2. Sobald die Daten im TempDataDictionaryObjekt gespeichert sind :
    • Es bleibt darin erhalten und kann aus jeder Ansicht oder Aktion in jedem Controller gelesen werden
    • Es kann nur einmal gelesen werden; Einmal gelesen, wird es null
    • Es wird in der Sitzung gespeichert, sodass beim Ablauf der Sitzungsdaten verloren gehen.

Dieses Verhalten ist neu in ASP.NET MVC 2 und späteren Versionen. In früheren Versionen von ASP.NET MVC waren die Werte in TempDatanur bis zur nächsten Anforderung verfügbar.

  1. Es lebt, bis es gelesen wird oder die Sitzung abläuft und von überall gelesen werden kann.

Sehen Sie sich den Vergleich von ViewData, ViewBag, TempData und Session in MVC im Detail an

Ali Adravi
quelle
0

Ansichtsdaten werden verwendet, wenn Daten vom Controller an die entsprechende Ansicht übergeben werden sollen. Anzeigen von Daten haben eine sehr kurze Lebensdauer. Dies bedeutet, dass sie bei einer Umleitung zerstört werden. Beispiel (Controller):

public ViewResult try1()
    {
        ViewData["DateTime"] = DateTime.Now;
        ViewData["Name"] = "Mehta Hitanshi";
        ViewData["Twitter"] = "@hitanshi";
        ViewData["City"] = "surat";
        return View();
    }

try1.cshtm

<table>
<tr>
    <th>Name</th>
    <th>Twitter</th>
    <th>Email</th>
    <th>City</th>
    <th>Mobile</th>
</tr>
<tr>
    <td>@ViewData["Name"]</td>
    <td>@ViewData["Twitter"]</td>
    <td>@ViewData["City"]</td>
</tr>
</table> 

TempData überträgt die Daten zwischen Controllern oder zwischen Aktionen. Es wird zum Speichern von einmaligen Nachrichten verwendet und hat eine sehr kurze Lebensdauer. Wir können TempData.Keep () verwenden, um es für alle Aktionen verfügbar zu machen oder um es dauerhaft zu machen.

Beispiel (Controller):

public ActionResult try3()
    {
        TempData["DateTime"] = DateTime.Now;
        TempData["Name"] = "Ravina";
        TempData["Twitter"] = "@silentRavina";
        TempData["Email"] = "[email protected]";
        TempData["City"] = "India";
        TempData["MobNo"] = 9998975436;
        return RedirectToAction("TempView1");
    }
    public ActionResult TempView1()
    {
        return View();
    }

TempView1.cshtm

<table>
<tr>
    <th>Name</th>
    <th>Twitter</th>
    <th>Email</th>
    <th>City</th>
    <th>Mobile</th>
</tr>
<tr>
    <td>@TempData["Name"]</td>
    <td>@TempData["Twitter"]</td>
    <td>@TempData["Email"]</td>
    <td>@TempData["City"]</td>
    <td>@TempData["MobNo"]</td>
</tr>
</table>
Hitanshi Mehta
quelle