Widziałem ViewBag
w MVC 3. Czym różni się to od ViewData
MVC 2?
Widziałem ViewBag
w MVC 3. Czym różni się to od ViewData
MVC 2?
Odpowiedzi:
Wykorzystuje funkcję dynamiczną C # 4.0. Osiąga ten sam cel, co viewdata i należy go unikać na korzyść stosowania silnie typowanych modeli widoków (w taki sam sposób, jak należy unikać viewdata).
Zasadniczo zastępuje magiczne ciągi :
ViewData["Foo"]
o właściwościach magicznych :
ViewBag.Foo
dla których nie masz bezpieczeństwa czasu kompilacji.
Nadal obwiniam Microsoft za wprowadzenie tej koncepcji w MVC.
W nazwach właściwości rozróżniana jest wielkość liter.
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
Kontrolery MVC 2 obsługują właściwość ViewData, która umożliwia przesyłanie danych do szablonu widoku przy użyciu interfejsu API słownika powiązanego z opóźnieniem. W MVC 3 można również użyć nieco prostszej składni z właściwością ViewBag, aby osiągnąć ten sam cel. Na przykład zamiast pisać ViewData [„Message”] = „text”, możesz napisać ViewBag.Message = „text”. Nie trzeba definiować żadnych silnie typowanych klas, aby korzystać z właściwości ViewBag. Ponieważ jest to właściwość dynamiczna, zamiast tego możesz po prostu uzyskać lub ustawić właściwości, które rozwiążą je dynamicznie w czasie wykonywania. 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 została nazwana właściwością ViewModel.)
ViewData
a ViewBag
nie o ViewModel
.
dynamic
i wspiera ViewBag.Message
. Jeden używa starej ViewData["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:
Pomaga zachować dane podczas przechodzenia z kontrolera do widoku. Służy do przesyłania danych z kontrolera do odpowiedniego widoku. Krótkie życie oznacza, że wartość staje się zerowa, gdy nastąpi przekierowanie. Wynika to z tego, że ich celem jest zapewnienie sposobu komunikacji między kontrolerami a widokami. Jest to mechanizm komunikacji w wywołaniu serwera.
Różnica między ViewBag i ViewData:
ViewData to słownik obiektów, który pochodzi z klasy ViewDataDictionary i jest dostępny za pomocą łańcuchów jako kluczy. ViewBag to dynamiczna właściwość, która wykorzystuje nowe dynamiczne funkcje w C # 4.0. ViewData wymaga rzutowania typu dla złożonych typów danych i sprawdzania wartości zerowych, aby uniknąć błędów. ViewBag nie wymaga rzutowania typu dla złożonych typów danych.
ViewBag i ViewData Przykład:
public ActionResult Index()
{
ViewBag.Name = "Arun Prakash";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Arun Prakash";
return View();
}
Dzwonienie w widoku
@ViewBag.Name
@ViewData["Name"]
typecasting
ale nie pokazałeś, jak odbywa się rzutowanie czcionek
ViewData
: 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:
public class HomeController : Controller
{
public ActionResult Index()
{
var emp = new Employee
{
EmpID=101,
Name = "Deepak",
Salary = 35000,
Address = "Delhi"
};
ViewData["emp"] = emp;
ViewBag.Employee = emp;
return View();
}
}
A kod dla tego View
jest następujący:
@model MyProject.Models.EmpModel;
@{
Layout = "~/Views/Shared/_Layout.cshtml";
ViewBag.Title = "Welcome to Home Page";
var viewDataEmployee = ViewData["emp"] as Employee; //need type casting
}
<h2>Welcome to Home Page</h2>
This Year Best Employee is!
<h4>@ViewBag.Employee.Name</h4>
<h3>@viewDataEmployee.Name</h3>
<h4>@ViewBag.emp.Name</h4>
powinno się zmienić na<h4>@ViewBag.Employee.Name</h4>
Wszystkie odpowiedzi sugerują, że ViewBag
i / lub ViewData
ma przekazywać dane od Controller
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:
<title>@ViewData["Title"] - MyApp</title>
i w dowolnym widoku
ViewData["Title"] = "Details";
Zatem zadając pytanie: jaka jest różnica między ViewBag
iViewData
?
Najbardziej zauważalną różnicą jest ViewData
natomiast silnie typowany słownik
ViewBag
typ dynamiczny.
Pamiętaj, że dane w TYM SAMYM
ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";
Kiedy używać jednego lub drugiego?
ViewBag
nie obsługuje nieprawidłowych nazw C #. nie możesz uzyskać dostępu za ViewData["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 jak ContainsKey
, 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 gdy ViewBag
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"]
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.
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.
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 ...
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
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”
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
In View:
@ViewBag.Name
@ViewData["Name"]
W ten sposób możemy zmusić go do wykorzystania wartości do przekazania informacji między sterownikiem na inną stronę z DANYMI TEMP
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.
namespace WebApplication1.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
Products p1 = new Products();
p1.productId = 101;
p1.productName = "Phone";
Products p2 = new Products();
p2.productId = 102;
p2.productName = "laptop";
List<Products> products = new List<Products>();
products.Add(p1);
products.Add(p2);
ViewBag.Countries = products;
return View();
}
}
public class Products
{
public int productId { get; set; }
public string productName { get; set; }
}
}
Wyświetl kod.
<ul>
@foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
{
<li>@item.productId @item.productName</li>
}
</ul>
Ekran wyjścia.
Zobacz dane
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
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
public ActionResult PassingDatatoViewWithViewData()
{
ViewData["Message"] = "This message shown in view with the ViewData";
return View();
}
Z uwagi
@ViewData["Message"];
- 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.
public ActionResult PassingDatatoViewWithViewData()
{
var type= new List<string>
{
"MVC",
"MVP",
"MVVC"
};
ViewData["types"] = type;
return View();
}
- W widoku danych można wyodrębnić jako
<ul>
@foreach (var items in (List<string>)ViewData["types"])
{
<li>@items</li>
}
</ul>
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:
public ActionResult PassingDatatoViewWithViewBag()
{
ViewData.Message = "This message shown in view with the ViewBag";
return View();
}
Z uwagi
@ViewBag.vbMessage
- Dla typu złożonego użyj ViewBag
public ActionResult PassingDatatoViewWithViewBag()
{
var type= new List<string>
{
"MVC",
"MVP",
"MVVC"
};
ViewBag.types = type;
return View();
}
- W widoku danych można wyodrębnić jako
<ul>
@foreach (var items in ViewBag.types)
{
<li>@items</li>
}
</ul>
- główna różnica polega na tym, że ViewBag nie wymaga rzutowania, ale ViewData jest wymagany.
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ść:
ViewBag.Name = "Value";
i może uzyskać dostęp w następujący sposób:
@ViewBag.Name
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:
ViewData["Name"] = "Value";
i dostęp do takiej wartości
@ViewData["Name"]
Aby uzyskać więcej informacji kliknij tutaj: