ViewBag, ViewData, TempData

Gdy już jesteśmy w temacie kontrolerów, warto także poruszyć temat przekazywania danych do widoków. Oczywiście robimy to za pomocą ViewModeli, ale istnieją także inne metody przekazywana danych. Do dyspozycji mamy takie obiekty jak:

  • ViewBag,
  • ViewData,
  • TempData.

ViewBag i ViewData są obiektami tworzonymi tylko na czas bieżącego żądania. Podczas przekierowania pod inny adres wartości w nich zawarte przyjmują wartość null. ViewData jest to słownik, którego kluczem jest string, a wartością typ object. Podczas używania wymagane jest sprawdzanie przed nullem i rzutowanie, aby uniknąć pojawienia się błędu.
ViewBag jest typu dynamic, więc może przyjąć dowolny typ. Nie wymaga rzutowania typów.
Nieco więcej różnic zawiera TempData. Pozawala on na przekazywanie danych pomiędzy dwoma żądaniami HTTP (bieżącym i kolejnym), przechowuje on dane przez cały czas trwania żądania HTTP. Pomaga utrzymać dane podczas przemieszczania się pomiędzy kontrolerami lub akcjami. Korzystając z TempData musimy zapewnić sprawdzenie wartości przed nullem oraz rzutowanie na odpowiedni typ, w celu uniknięcia wystąpienia błędu. Obiekt ten jest używany głównie do przechowywania jednorazowych wiadomości jak np. komunikaty błędów.
Przykład: chcemy przekazać wartości lokalizacji i typów do kontrolki DropDown w widoku.
Kod zawarty w kontrolerze:

W obu przypadkach z ViewBag i ViewData wartości zostaną poprawnie przekazane do widoku.
Kod zawarty w widoku:

Możemy też bezpośrednio dobrać się do wartości zawartych w obiektach ViewBag i ViewData:

W przypadku TempData wygląda to tak samo.
Kod w kontrolerze:

Kod w widoku:

W przypadku przekazywania wartości TempData pomiędzy akcjami wygląda to tak:

Zapisujemy wartość do obiektu TempData w akcji index i przekierowujemy do akcji Create.
W akcji create pobieramy wartość TempData[„TestVal”] i sprawdzamy czy jest to „TempDataTestVal”.

clip_image001

Jak widać wartość została przekazana.