View Bag, ViewData, TempData w ASP.net MVC

ViewBag - przekazywanie danych z kontrolera do widoku.


W ASP.NET MVC mamy 3 możliwości przekazywania danych z kontrolera do widoku. ViewBag i ViewData są prawie identyczne natomiast TempData posiada dłuższy czas istnienia.

Cechy wspólne ViewBag i ViewData

Zarówno ViewBag jak i ViewData są to obiekty krótkotrwałe, tworzone są na czas otwarcia widoku, po kliknięciu linka do innego adresu url zostają skasowane.

Różnice ViewBag i ViewData:

  • ViewData to kolekcja typu słownik (Dictionary) zawierająca typy object, dziedzicząca po klasie ViewDataDictionary, kluczami w tym słowniku są zmienne typu string,
  • ViewData wymaga rzutowania dla typów złożonych oraz sprawdzania wartości null aby zapobiec błędom,
  • ViewBag jest typu dynamic (C# 4.0) a więc można zmieniać typ zmiennej w dowolnym momencie i nie wymaga rzutowania jak ViewData.

Przykład ViewBag w kontrolerze:

public ActionResult Login(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    return View();
}

Odczyt wartości z ViewBag w widoku:

@ViewBag.ReturnUrl

Przykład ViewData w kontrolerze:

public ActionResult Login(string returnUrl)
{
    ViewData["ReturnUrl"] = returnUrl;
    return View();
}

Odczyt wartości z ViewData w widoku:

@ViewData["ReturnUrl"]

TempData

TempData w pozwala przekazywać dane pomiędzy obecnym i kolejnymi żądaniami HTTP, nie tylko jednym jak w przypadku ViewData i ViewBag. Dane z TempDatazapisywane w sesji, niesie to ze sobą pewne konsekwencje. Przeglądarka użytkownika może mieć wyłączone ciasteczka, przez co nie uda się przekazać danych z TempData. Możliwe jest również trzymanie sesji na serwerze jednak to rozwiązanie niesie ze sobą inny problem. W przypadku, gdy portal obsługuje więcej niż jeden fizyczny serwer, ruch jest dzielony w zależności od obciążenia konkretnego serwera. Może się zdarzyć, że użytkownik przy kolejnym żądaniu zostanie skierowany na inny serwer, który nie posiada zapisanej sesji. Jedynym słusznym rozwiązaniem w tym wypadku jest trzymanie sesji we wspólnej bazie danych. Dane sesji są w tym wypadku współdzielone pomiędzy serwerami.

Przykład TempData w kontrolerze:

public ActionResult Login(string returnUrl)
{
    TempData["ReturnUrl"] = returnUrl;
    return View();
}

Odczyt wartości z ViewData w widoku:

@TempData["ReturnUrl"]
Komentarze facebook (polub nasz profil na FB aby je zobaczyć):