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
TempData są
zapisywane 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ć):