Blog Dla Młodszych Programistów C#/.NET

wtorek, 1 grudnia 2020
Programiści ASP.NET MVC wiedzą, że z kontrolera do widoku można przekazać dane na różne sposoby. Najpopularniejszym sposobem jest użycie ViewModelu, ale można też użyć między inny ViewBag, ViewData oraz TempaData, ale czym tak naprawdę, różnią się te 3 sposoby? O tym dowiesz się z tego artykułu. Postaram Ci się właśnie przybliżyć te 3 podejścia oraz pokazać, jaka jest między nimi podstawowa różnica.

Różnica Pomiędzy ViewData, ViewBag oraz TempData


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?
Autor artykułu:
Kazimierz Szpin
Kazimierz Szpin
CTO & Founder - FindSolution.pl
Programista C#/.NET. Specjalizuje się w Blazor, ASP.NET Core, ASP.NET MVC, ASP.NET Web API, WPF oraz Windows Forms.
Autor bloga ModestProgrammer.pl
Komentarze (1)
kki
KKI, środa, 17 sierpnia 2022 12:35
Dziękuję za wyjaśnienie, przydało się. Brakło mi informacji jak poprawnie czyścić po użyciu dane z TempData, Chciałbym przekazać dane do innej akcji ale nie chciałbym by te dane były trzymane do końca sesji. Ja to zrobiłem w widoku: @TempData["SuccessInfo"]) @{ TempData["SuccessInfo"] = ""; }
Dodaj komentarz

Wyszukiwarka

© Copyright 2024 modestprogrammer.pl. Wszelkie prawa zastrzeżone. Regulamin. Polityka prywatności. Design by Kazimierz Szpin