Widziałem ViewBag
w MVC 3. Czym różni się to od ViewData
MVC 2?
.net
asp.net-mvc-3
difference
viewbag
viewdata
użytkownik469652
źródło
źródło
Wewnętrznie właściwości ViewBag są przechowywane jako pary nazwa / wartość w słowniku ViewData .
Uwaga: w większości przedpremierowych wersji MVC 3 właściwość ViewBag nosiła nazwę ViewModel, jak zauważono w tym fragmencie z uwag do wydania MVC 3:
(edytowane 10-8-12) Sugerowano, że opublikuję źródło tych informacji, które opublikowałem, oto źródło: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4
źródło
ViewData
aViewBag
nie oViewModel
.dynamic
i wspieraViewBag.Message
. Jeden używa starejViewData["Message"]
składni.ViewBag vs ViewData w MVC
http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html
Podobieństwa między ViewBag i ViewData:
Różnica między ViewBag i ViewData:
ViewBag i ViewData Przykład:
Dzwonienie w widoku
źródło
typecasting
ale nie pokazałeś, jak odbywa się rzutowanie czcionekViewData
: Wymaga rzutowania typu dla złożonych typów danych i sprawdza wartości zerowe, aby uniknąć błędów.ViewBag
: Nie wymaga rzutowania typu dla złożonych typów danych.Rozważ następujący przykład:
A kod dla tego
View
jest następujący:źródło
<h4>@ViewBag.emp.Name</h4>
powinno się zmienić na<h4>@ViewBag.Employee.Name</h4>
Wszystkie odpowiedzi sugerują, że
ViewBag
i / lubViewData
ma przekazywać dane odController
doViews
, który jest dezinformacja. oba są bardzo przydatne do przesyłania danych z widoków do układu lub częściowych do widoków (lub ViewComponents itp.) Nie jest to wyłącznie kontroler.jako domyślny przykład asp.net mają to na stronie układu:
i w dowolnym widoku
Zatem zadając pytanie: jaka jest różnica między
ViewBag
iViewData
?Najbardziej zauważalną różnicą jest
ViewData
natomiast silnie typowany słownikViewBag
typ dynamiczny.Pamiętaj, że dane w TYM SAMYM
Kiedy używać jednego lub drugiego?
ViewBag
nie obsługuje nieprawidłowych nazw C #. nie możesz uzyskać dostępu zaViewData["Key With Space"]
pomocąViewBag
ViewBag.Something
jest dynamiczny i możesz mieć problemy z wywoływaniem metod (takich jak metody rozszerzeń), które muszą znać dokładny parametr w czasie kompilacji.ViewBag
może sprawdzić zerowy syntaktyczny środek czyszczący:ViewBag.Person?.Name
ViewData
mieć wszystkie właściwości słownika, takie jakContainsKey
,Add
itp., więc możesz używać,ViewData.Add("somekey", "somevalue")
pamiętaj, że może generować wyjątki.ViewData
z widoków wymaga TypeCasting, podczas gdyViewBag
nie.Znajomość subtelnych różnic, używanie jednego lub drugiego jest o wiele bardziej preferencją smakową.
Zwykle można wymyślić
ViewBag.AnyKey
aliasViewData["AnyKey"]
źródło
Czy mogę Ci polecić, abyś nie używał?
Jeśli chcesz „wysłać” dane na ekran, wyślij obiekt o silnym typie (AKA ViewModel), ponieważ łatwiej go przetestować.
Jeśli połączysz się z jakimś „modelem” i masz losowe „viewbag” lub „viewdata”, to bardzo utrudnia automatyczne testowanie.
Jeśli ich używasz, zastanów się, w jaki sposób możesz dokonać restrukturyzacji i po prostu użyj ViewModels.
źródło
Istnieją pewne subtelne różnice, które oznaczają, że możesz używać ViewData i ViewBag na nieco inne sposoby niż widok. Jedna zaleta jest przedstawiona w tym poście http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx i pokazuje, że casting można uniknąć w tym przykładzie, używając ViewBag zamiast ViewData.
źródło
viewdata: jest słownikiem służącym do przechowywania danych między View a kontrolerem, musisz rzutować obiekt danych view na odpowiadający mu model w widoku, aby móc pobrać z niego dane ...
ViewBag: jest dynamiczną właściwością działającą podobnie do danych widoku, jednak lepiej, ponieważ nie trzeba jej rzutować na odpowiedni model przed użyciem go w widoku ...
źródło
Poniżej znajduje się różnica punkt-punkt dotycząca ViewData, ViewBag, TempData i sesji. Kredyt / skopiowane askforprogram.in , kliknij link do przykładu kodu, o którym tu nie wspomniałem.
ViewData w MVC
ViewBag w MVC
TempData w MVC
Sesja w MVC
źródło
Chociaż możesz nie mieć technicznej przewagi, wybierając jeden format nad drugim, powinieneś zdawać sobie sprawę z pewnych ważnych różnic między dwiema składniami. Jedną oczywistą różnicą jest to, że ViewBag działa tylko wtedy, gdy klucz, do którego uzyskujesz dostęp, jest prawidłowym identyfikatorem C #. Na przykład, jeśli umieścisz wartość w ViewData [„Key With Spaces”], nie będziesz mógł uzyskać dostępu do tej wartości za pomocą ViewBag, ponieważ kod nie zostanie skompilowany. Innym kluczowym zagadnieniem do rozważenia jest to, że nie można przekazać wartości dynamicznych jako parametrów metod rozszerzenia. Kompilator C # musi znać prawdziwy typ każdego parametru w czasie kompilacji, aby wybrać prawidłową metodę rozszerzenia. Jeśli dowolny parametr jest dynamiczny, kompilacja się nie powiedzie. Na przykład ten kod zawsze się nie powiedzie: @ Html.TextBox („name”, ViewBag.Name). Aby obejść ten problem, użyj ViewData [„Nazwa”
źródło
źródło
W ten sposób możemy zmusić go do wykorzystania wartości do przekazania informacji między sterownikiem na inną stronę z DANYMI TEMP
źródło
Jedną z głównych różnic, które zauważyłem między ViewData i ViewBag, jest:
ViewData: zwróci obiekt, bez względu na to, co do niego przypisałeś i musisz ponownie rzutować typ do pierwotnego typu.
ViewBag: wystarczy inteligentnie zwrócić dokładny typ, który mu przypisałeś, nie ma znaczenia, czy przypisałeś typ prosty (np. Int, string itp.) Czy typ złożony.
Np .: kod kontrolera.
Wyświetl kod.
Ekran wyjścia.
źródło
Zobacz dane
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
źródło
- ViewData służy do przekazywania danych z kontrolera do przeglądania
- Wywodzi się z klasy ViewDataDictionary
- Jest dostępny tylko dla bieżącego żądania
- Wymaga rzutowania złożonego typu danych i sprawdza wartości zerowe, aby uniknąć błędów
- Jeśli nastąpi przekierowanie, jego wartość staje się zerowa
ViewBagźródło
Tutaj zarówno ViewData, jak i ViewBag są używane do przekazywania danych z kontrolera do widoku .
1. ViewData
- ViewData to obiekt słownika pochodzący z klasy ViewDataDictonary .
- Dane pozwalają tylko na jedno żądanie, wartości ViewData są usuwane, gdy nastąpi przekierowanie strony.
- Przed użyciem należy wpisać wartość ViewData.
Przykład: w kontrolerze
Z uwagi
- W ViewData jest para taka jak Klucz i Wartość , Wiadomość jest Kluczem, a w odwróconym przecinku wartość to Wartość.
- Dane są proste, więc nie możemy tutaj użyć rzutowania typu, jeśli dane są złożone, a następnie za pomocą rzutowania typu.
- W widoku danych można wyodrębnić jako
2. ViewBag
--ViewBag używa funkcji dynamicznej. Opakowanie ViewBag wokół ViewData.
- W przypadku typu ViewBag wymagany jest rzut.
- Taki sam jak ViewData, jeśli nastąpi przekierowanie, wartość staje się pusta.
Przykład:
Z uwagi
- Dla typu złożonego użyj ViewBag
- W widoku danych można wyodrębnić jako
- główna różnica polega na tym, że ViewBag nie wymaga rzutowania, ale ViewData jest wymagany.
źródło
ViewBag i ViewData to dwa sposoby przesyłania informacji z kontrolera w celu wyświetlenia w ASP.Net MVC. Celem użycia obu mechanizmów jest zapewnienie komunikacji między kontrolerem a widokiem. Oba mają krótkie życie, co oznacza, że wartość obu staje się zerowa po wystąpieniu przekierowania, tj. Po przekierowaniu strony ze strony źródłowej (gdzie ustawiamy wartość ViewBag lub ViewData) na stronę docelową, zarówno ViewBag, jak i ViewData staje się zerowy.
Pomimo tych podobieństw oba (ViewBag i ViewData) to dwie różne rzeczy, jeśli mówimy o implementacji obu. Różnice są następujące:
1.) Jeśli przeanalizujemy obie implementacje pod względem mądrości, okaże się, że ViewData jest strukturą danych słownikowych - Słownik obiektów pochodzących z ViewDataDictionary i dostępny za pomocą ciągów jako kluczy do tych wartości, podczas gdy ViewBag wykorzystuje funkcje dynamiczne wprowadzone w C # 4.0 i jest dynamiczną właściwością.
2.) Podczas uzyskiwania dostępu do wartości z ViewData musimy typecast wartości (typy danych), ponieważ są one przechowywane jako obiekty w słowniku ViewData, ale nie ma takiej potrzeby, jeśli uzyskujemy dostęp do tej wartości w przypadku ViewBag.
3.) W ViewBag możemy ustawić następującą wartość:
i może uzyskać dostęp w następujący sposób:
Podczas gdy w przypadku ViewData wartości można ustawić i uzyskać do nich dostęp w następujący sposób: Ustawienie ViewData w następujący sposób:
i dostęp do takiej wartości
Aby uzyskać więcej informacji kliknij tutaj:
źródło