Czy każde ciało może wyjaśnić, kiedy stosować
- TempData
- ViewBag
- ViewData
Mam wymaganie, w którym muszę ustawić wartość w kontrolerze pierwszym, że kontroler przekieruje do kontrolera dwa, a kontroler drugi wyświetli widok.
Próbowałem użyć ViewBag, wartość gubi się, kiedy osiągam kontroler drugi.
Czy mogę wiedzieć, kiedy stosować oraz jakie są zalety i wady?
Dzięki
asp.net-mvc-3
Hari Gillala
źródło
źródło
Odpowiedzi:
Umożliwia przechowywanie danych, które przetrwają dla przekierowania. Wewnętrznie używa Sesji jako magazynu kopii zapasowych, po wykonaniu przekierowania dane są automatycznie eksmitowane. Wzór jest następujący:
Umożliwia przechowywanie danych w akcji kontrolera, która zostanie użyta w odpowiednim widoku. Zakłada się, że akcja zwraca widok i nie przekierowuje. Mieszka tylko podczas bieżącego żądania.
Wzór jest następujący:
i w widoku:
lub z ViewData:
i w widoku:
ViewBag
jest tylko dynamicznym opakowaniemViewData
i istnieje tylko w ASP.NET MVC 3.To powiedziawszy, żaden z tych dwóch konstruktów nigdy nie powinien być używany. Powinieneś używać modeli widoków i silnie typowanych widoków. Prawidłowy wzorzec jest następujący:
Zobacz model:
Akcja:
Mocno napisany widok:
Po tym krótkim wstępie odpowiedzmy na twoje pytanie:
i odpowiedni widok (
~/Views/Two/Index.cshtml
):Istnieją także wady stosowania TempData: jeśli użytkownik naciśnie F5 na stronie docelowej, dane zostaną utracone.
Osobiście nie używam TempData. To dlatego, że wewnętrznie korzysta z sesji, a ja wyłączam sesję w moich aplikacjach. Wolę bardziej RESZTNY sposób na osiągnięcie tego. To jest: w pierwszej akcji kontrolera, która wykonuje przekierowanie, zapisz obiekt w magazynie danych i użyj wygenerowanego unikalnego identyfikatora podczas przekierowania. Następnie w akcji docelowej użyj tego identyfikatora, aby pobrać początkowo przechowywany obiekt:
Widok pozostaje taki sam.
źródło
ViewBag.Title
właściwość we wszystkich moich_Layout.cshtml
widokach, która jest wykorzystywana w moim pliku widoku podstawowego. Innym przypadkiem, w którym go używam, jest przekazywanie użytkownikom informacji (np. „Produkt został zapisany pomyślnie!”). Umieściłem niektóre ogólne znaczniki,Layout.cshtml
aby renderować komunikat, jeśli jest podany, i pozwala mi to ustawićViewBag.Message
dowolną akcję. Korzystanie z właściwości ViewModel w obu przypadkach ma zbyt wiele wad.ViewBag
. Opisz konkretny scenariusz, w którym ViewBag ma jakieś zastosowanie. Skoro mówisz, że tak, cytuję potężny zasób , myślę, że masz kilka konkretnych przypadków, w których ten potężny zasób jest potężny . Ponieważ nigdy nie używałam go w swojej karierze, byłbym bardzo szczęśliwy, gdyby dowiedzieć się, jak ludzie używają tej potężnej broni.ASP.NET MVC oferuje nam trzy opcje ViewData, ViewBag i TempData do przekazywania danych z kontrolera do przeglądania oraz w następnym żądaniu. ViewData i ViewBag są prawie podobne, a TempData ponosi dodatkową odpowiedzialność. Omówmy lub uzyskaj kluczowe punkty dotyczące tych trzech obiektów:
Podobieństwa między ViewBag i ViewData:
Różnica między ViewBag i ViewData:
ViewBag i ViewData Przykład:
Z uwagi:
TempData:
TempData jest także słownikiem wywodzącym się z klasy TempDataDictionary i przechowywanym w krótkiej sesji życia oraz jest kluczem łańcuchowym i wartością obiektu. Różnica polega na tym, że cykl życia obiektu. TempData przechowuje informacje na czas żądania HTTP. To oznacza tylko z jednej strony na drugą. Działa to również z przekierowaniem 302/303, ponieważ znajduje się w tym samym żądaniu HTTP. Pomaga zachować dane podczas przechodzenia od jednego kontrolera do drugiego lub od jednej akcji do innej. Innymi słowy, gdy przekierowujesz, „TempData” pomaga zachować dane między tymi przekierowaniami. Używa wewnętrznie zmiennych sesji. Wykorzystanie danych tymczasowych podczas bieżącego i kolejnego żądania oznacza, że jest ono używane, gdy masz pewność, że następne żądanie przekieruje do następnego widoku. Wymaga to rzutowania złożonego typu danych i sprawdzania wartości zerowych, aby uniknąć błędów.
Ostatnim mechanizmem jest Sesja, która działa jak ViewData, jak Słownik, który pobiera ciąg klucza i obiekt wartości. Ten jest przechowywany w klienckim pliku cookie i może być używany przez znacznie dłuższy czas. Potrzebuje także większej weryfikacji, aby nigdy nie mieć żadnych poufnych informacji. Jeśli chodzi o ViewData lub ViewBag, powinieneś używać go inteligentnie do działania aplikacji. Ponieważ każda akcja przechodzi przez cały cykl życia zwykłego żądania asp.net mvc. Możesz użyć ViewData / ViewBag w akcji podrzędnej, ale uważaj, aby nie używać go do wypełniania niepowiązanych danych, które mogą zanieczyścić kontroler.
źródło
TempData
Zasadniczo jest to jak czytnik danych, po odczytaniu dane zostaną utracone.
Sprawdź to wideo
Przykład
Jeśli zwrócisz uwagę na powyższy kod, RedirectToAction nie ma wpływu na TempData, dopóki TempData nie zostanie odczytana. Zatem po odczytaniu TempData wartości zostaną utracone.
Jak mogę zachować TempData po przeczytaniu?
Sprawdź dane wyjściowe w teście metody działania 1 i teście 2
Jeśli zwrócisz uwagę na powyższy kod, dane nie zostaną utracone po RedirectToAction, a także po odczytaniu danych, a powodem jest to, że używamy
TempData.Keep()
. czy toW ten sposób możesz utrzymać go tak długo, jak chcesz w innych kontrolerach.
ViewBag / ViewData
Dane pozostaną w odpowiednim widoku
źródło
TempData w Asp.Net MVC jest jedną z bardzo przydatnych funkcji. Służy do przekazywania danych z bieżącego żądania do kolejnego żądania. Innymi słowy, jeśli chcemy przesyłać dane z jednej strony na drugą, gdy nastąpi przekierowanie, możemy użyć TempData, ale musimy rozważyć kod, aby osiągnąć tę funkcję w MVC. Ponieważ życie TempData jest bardzo krótkie i trwa tylko do momentu pełnego załadowania widoku docelowego. Ale możemy użyć metody Keep (), aby utrwalić dane w TempData.
Czytaj więcej
źródło
ViewBag, ViewData, TempData i View State w MVC
http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html
ASP.NET MVC oferuje nam trzy opcje ViewData, VieBag i TempData do przekazywania danych z kontrolera do przeglądania i na następne żądanie. ViewData i ViewBag są prawie podobne, a TempData ponosi dodatkową odpowiedzialność.
Podobieństwa między ViewBag i ViewData:
Różnica między ViewBag i ViewData:
ViewBag i ViewData Przykład:
W widoku nazywamy się jak poniżej:
TempData:
Jedynym scenariuszem, w którym użycie TempData będzie działało niezawodnie, jest przekierowanie. Wynika to z faktu, że przekierowanie zabija bieżące żądanie (i wysyła kod stanu HTTP 302 Obiekt przeniesiony do klienta), a następnie tworzy nowe żądanie na serwerze, aby obsłużyć przekierowany widok.
Wymaga to rzutowania złożonego typu danych i sprawdzania wartości zerowych, aby uniknąć błędów.
źródło
źródło
TempData będzie zawsze dostępna do pierwszego czytania, a gdy już ją przeczytasz, nie jest już dostępna, przydatne może być przekazanie szybkiej wiadomości również w celu wyświetlenia, które zniknie po pierwszym czytaniu. ViewBag Przydaje się przy szybkim przekazywaniu fragmentu danych do widoku, zwykle należy przekazać wszystkie dane do widoku przez model, ale zdarzają się przypadki, gdy model pochodzi bezpośrednio z klasy, która jest odwzorowana w bazie danych, podobnie jak struktura encji, w tym przypadku Aby zmienić swój model, aby przekazać nowy kawałek danych, możesz włożyć go do workbagu ViewData to tylko indeksowana wersja ViewBag i była używana przed MVC3
źródło
Również zakres różni się między viewbag a temptdata. viewbag opiera się na pierwszym widoku (nie jest dzielony między metodami akcji), ale temptdata może być dzielona między metodą akcji i tylko między sobą.
źródło