Przykład 1
Jak to wygląda w praktyce:
//Kontroller:
using Microsoft.AspNetCore.Mvc;
namespace Demo.Controllers
{
public class HomeController : Controller
{
public IActionResult Index()
{
ViewData["Age"] = 32;
ViewBag.Year = 2020;
TempData["Number"] = 1;
return View();
}
}
}
//Widok:
<div>
AGE => @ViewData["Age"] <br />
YEAR => @ViewBag.Year <br />
NUMBER => @TempData["Number"] <br />
</div>
//Wynik:
AGE => 32
YEAR => 2020
NUMBER => 1
Jak widzisz w naszym pierwszym przypadku, wszystkie wyniki są prawidłowe i takie jak zakładaliśmy. Który sposób w takim razie jest najlepszy i czym tak naprawdę się one różnią?
ViewData
ViewData jest to słownik (dictionary), do którego wartości odwołujemy się poprzez podanie odpowiedniego klucza, który jest string'iem. Czyli w nawiasach kwadratowych podajemy sam klucz i do tego klucza przypisujemy daną wartość, jeżeli chcemy wyświetlić wartość, to również w takich nawiasach podajemy string'a, czyli klucz, pod jakim znajduje się wartość w tym słowniku. Jako wartość słownika podajemy dowolny typ object. Jeżeli odczytujemy wartość z tego słownika, to również otrzymujemy typ object, także zazwyczaj jeszcze ViewData wymaga od nas rzutowania na inny złożony typ. Co w przypadku ViewData jest jeszcze istotne, to fakt, że jego wartość jest przechowywana tylko w obrębie jednego żądania. Jeżeli nastąpi przekierowanie, to wartość zostanie usunięta.
ViewBag
ViewBag jest taką, można powiedzieć ulepszoną wersją ViewData. Jest takim wrapperem na ViewData, przez co jest trochę wolniejszy. Jest to typ dynamic, dzięki czemu nie musimy za każdym razem rzutować na typ oczekiwany. Podobnie jak ViewData wartość jest przechowywana tylko w obrębie jednego żądania. Jeżeli chcemy przypisać jakiś obiekt do ViewBag, to wystarczy wpisać dowolną nazwę po kropce i zrobić przypisanie, podobnie jak przypisujemy wartości do właściwości obiektów. Również w ten sam sposób możemy odczytać wartość w widoku.
TempData
Jeżeli chodzi o TempData, to wartości przypisujemy podobnie jak do ViewData, ponieważ również jest to typ słownikowy. To znaczy, po TempData umieszczamy w nawiasach kwadratowych string'a, który jest kluczem, pod którym kryje się jakaś wartość. Kluczowa różnica, jaka jest pomiędzy TempData, a ViewData jest taka, że przekierowanie nie powoduje usunięcia wartości TempData. Dane mogą być przekazywana pomiędzy żądaniami. Te dane są zapisywane w sesji.
Przykład 2
Jak mogłeś zauważyć na poprzednim przykładzie, wszystkie dane zostały wyświetlone prawidłowo. Przyjrzyjmy się sytuacji, gdy nasza akcja robi przekierowanie do innej akcji. Jak się już pewnie teraz domyślasz, nie wszystko dane zostaną w takim przypadku wyświetlone prawidłowo:
//Kontroller:
using Microsoft.AspNetCore.Mvc;
namespace Demo.Controllers
{
public class HomeController : Controller
{
public IActionResult Home()
{
ViewData["Age"] = 32;
ViewBag.Year = 2020;
TempData["Number"] = 1;
return RedirectToAction("Index");
}
public IActionResult Index()
{
return View();
}
}
}
//Widok:
<div>
AGE => @ViewData["Age"] <br />
YEAR => @ViewBag.Year <br />
NUMBER => @TempData["Number"] <br />
</div>
//Wynik:
AGE =>
YEAR =>
NUMBER => 1
Tak jak przypuszczaliśmy, tylko dane przekazane za pomocą TempData w tym przypadku zostały prawidłowo przekazane do widoku.
PODSUMOWANIE
Jak widzisz mamy kilka sposobów przekazywania danych z kontrolera do widoku. Dzisiaj przedstawiłem Ci 3 popularne sposoby, które czasem będziesz używał. Każdy z tych sposób jak to najczęściej bywa, ma kilka plusów i minusów. Mam nadzieję, że w zależności od sytuacji będziesz wiedział kiedy, którego z nich użyć. To tyle na dzisiaj, do zobaczenia w kolejnym wpisie 🙂
Poprzedni artykuł - Dlaczego Warto Zostać Programistą .NET? Szybka Analiza.
Następny artykuł - Czy Tak Naprawdę Znasz Różnice Pomiędzy First vs FirstOrDefault vs Single vs SingleOrDefault?