Różnica między ViewData a TempData?

95

Wiem, czym jest ViewData i używam go cały czas, ale w ASP.NET Preview 5 wprowadzono coś nowego o nazwie TempData.

Zwykle silnie wpisuję moje ViewData, zamiast korzystać ze słownika obiektów.

Kiedy więc powinienem używać TempData zamiast ViewData?

Czy są jakieś najlepsze praktyki?

Elijah Manor
źródło
Chciałbym TempDatatu dodać coś na temat stackoverflow.com/a/17199709/2015869
Imad Alazani

Odpowiedzi:

96

Jednym zdaniem: TempDatasą jak ViewData z jedną różnicą: zawierają tylko dane między dwoma kolejnymi żądaniami, po czym są niszczone. Możesz użyć TempDatado przekazywania komunikatów o błędach lub czegoś podobnego.

Chociaż nieaktualny, ten artykuł zawiera dobry opis TempDatacyklu życia.

Jak powiedział tutaj Ben Scheirman :

TempData to słownik pamięci tymczasowej obsługiwany przez sesję, który jest dostępny dla jednego żądania. Wspaniale jest przekazywać wiadomości między kontrolerami.

Dragan Panjkov
źródło
Myślę, że to dość duża różnica, ponieważ TempDatapociągnie to za sobą coś potencjalnie znacznie bardziej skomplikowanego (sesja) niż prosty słownik przekazywany z metody do metody
Matti Virkkunen
29

Gdy akcja zwraca wynik RedirectToAction, powoduje przekierowanie HTTP (odpowiednik Response.Redirect). Dane można zachować we właściwości (słowniku) TempData kontrolera na czas trwania pojedynczego żądania przekierowania HTTP.

Kapitanie Sensible
źródło
Czy wartość ViewData zostanie zachowana w tym samym przypadku?
IsmailS
9
@Ismail: Nie, ViewData nie zachowa danych przez przekierowanie. To główna różnica między danymi TempData.
Mariano Desanze
5

ViewData:

  • ViewData jest typem słownika public ViewDataDictionary ViewData { get; set; }
  • Może być używany do przekazywania danych z kontrolera do widoku tylko w jedną stronę
  • Jego życie leży tylko podczas aktualnej prośby
  • Jeśli przekazujesz ciąg, nie ma potrzeby pisania na maszynie
  • Jeśli przepuszczasz obiekt, musisz go wpisać na maszynie, ale przed tym musisz sprawdzić, czy nie jest pusty
  • Jest to właściwość on ControllerBase, która jest elementem nadrzędnym Controllerklasy

TempData:

  1. TempData do użytku wewnętrznego TempDataDictionary :public TempDataDictionary TempData { get; set; }
  2. Po zapisaniu danych w TempDataDictionary obiektu:
    • Utrzymuje się w nim i można go odczytać z dowolnego widoku lub dowolnej akcji w dowolnym kontrolerze
    • Można go przeczytać tylko raz; po przeczytaniu staje się zerowy
    • Jest zapisywany w sesji, więc po wygaśnięciu sesji dane są tracone.

To zachowanie jest nowe w ASP.NET MVC 2 i nowszych wersjach. We wcześniejszych wersjach ASP.NET MVC wartości w TempDatabyły dostępne tylko do następnego żądania.

  1. Żyje, dopóki nie zostanie odczytany lub sesja nie wygaśnie i można go odczytać z dowolnego miejsca.

Zobacz szczegółowe porównanie ViewData, ViewBag, TempData i Session w MVC

Ali Adravi
źródło
0

Dane widoku są używane, gdy chcemy przekazać dane z kontrolera do odpowiedniego widoku. dane widoku mają bardzo krótką żywotność, co oznacza, że ​​zostaną zniszczone, gdy nastąpi przekierowanie. Przykład (kontroler):

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 przesyła dane między administratorami lub między akcjami. Służy do przechowywania jednorazowych wiadomości, a jego żywotność jest bardzo krótka. Możemy użyć TempData.Keep (), aby udostępnić ją we wszystkich akcjach lub uczynić ją trwałą.

Przykład (kontroler):

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
źródło
0

Tylko uwaga na marginesie TempData.
Dane w nim są przechowywane nie do następnego żądania , ale do wywołania następnej operacji odczytu !
Zobacz:
TempData nie zniszczy po drugim żądaniu

narodziny
źródło