2012-12-08 23 views
30

Jestem całkiem nowy dla MVC4, EF5 i ASP.Net i wydaje mi się, że nie mogę znaleźć dobrej odpowiedzi w dowolnym miejscu.ViewModels lub ViewBag?

Zasadniczo, czy wszystko powinno być wykonane za pomocą modelu podglądu, czy też jest w porządku, aby włączyć również tę funkcję?

Powiedz, że mam metodę, która zapełnia listę rozwijaną i używam viewmodel do reprezentowania danych wyjściowych dla widoku.

jestem ok używać Viewbag.DropDown = PopulateDropdown(); lub lepiej byłoby włączenie to w ViewModel, tworząc obiekt do przytrzymaj List<SelectListItem> stworzony przez PopulateDropdown();?

Wiem, jak poręczny jest ViewBag, ale nie widzę jeszcze żadnego solidnego powodu, aby go nie używać? Jeśli ktokolwiek mógłby mi zaoferować więcej wglądu, byłoby to fantastyczne.

Odpowiedz

45

Zasadniczo, czy wszystko powinno być wykonane za pomocą modelu podglądu, czy też jest to OK , aby również zawierało torebkę ViewBox?

Wszystko powinno być wykonane wewnątrz modelu widoku. Tak właśnie wygląda model widoku. Klasa, którą konkretnie definiujesz, aby spełniać wymagania twojego widoku. Nie mieszaj ViewBags z ViewModels. Nie jest już jasne, skąd bierze się informacja. Używaj tylko modelu widoku (podejście, które zalecam) lub korzystaj tylko z ViewBags. Ale nie mieszaj wartości 2.

Więc w twoim konkretnym przykładzie będziesz miał właściwość w swoim modelu widoku, która jest typu IENumerable<SelectListItem> i wewnątrz twojego widoku będziesz używał silnie typowanej wersji helpera Html.DropDownListFor do wiązania na model:

@Html.DropDownListFor(x => x.ProductId, Model.Products) 

Oczywiście są to tylko moje 2 centy. Inni ludzie powiedzą, że miksowanie ViewModels i ViewBags jest w porządku i szanuję ich opinię.

+0

Dzięki, Czy istnieją inne korzyści przy użyciu ViewModels nad ViewBag oprócz abstrakcji to oferuje? – EverythingGeek

+10

Oczywiście, że istnieje. Otrzymujesz Intellisense i możesz korzystać z mocno wpisanych wersji helperów w swoich widokach. Otrzymujesz również kod przyjazny dla refaktorów i nie polegasz już na magicznych ciągach. Również jest jasne, skąd pochodzą informacje do danego widoku, patrząc tylko na model widoku, do którego ten widok jest silnie wpisany. Jeśli korzystasz z mieszanki ViewModels i ViewBag, powinieneś również spojrzeć na działanie kontrolera, które ustawia ViewBag. –

+0

Dzięki za wyczyszczenie :) – EverythingGeek

9

Preferuj ViewModels przez ViewBag, gdziekolwiek jesteś. Utwórz silnie wpisane widoki. Dzięki temu twój kod jest czystszy, mniej podatny na błędy, mniej podatny na błędy i łatwy w utrzymaniu.

ViewBags są tylko słowniki dynamicznie wpisywanych obiektów tracisz:

  • czas kompilacji sprawdzanie
  • Zdolność byłaby z ufnością (straci poparcie narzędzi) wsparcie
  • IDE - na przykład możliwość nawigacji do wszystkich zastosowań:
  • Intellisense

Dla punktów bonusowych tworzących szerokie wykorzystanie ViewBag zdobywa również punkt za pomocą MVC pattern

dostaję ViewBags Wrażenie zostały stworzone, aby rozwiązać problem krawędź indywidualnie w ASP.NET i ludzie z nich korzystać zamiast tworzenia przeglądać modele, które pierwotnie były przeznaczone do zaprojektowania platformy, ze szkodą dla ich pracy.


ze dzięki https://stackoverflow.com/a/15568190/10245

+1

Wciąż widzę tę rzecz o intellisense. To nie jest problem; po prostu deklarujesz/konwertujesz go w widoku i masz intellisense. Przyznaję, że nie używam viewmodels (prawdopodobnie z powodu lenistwa), ale wydaje się, że nie ma problemu z użyciem viewbacka, biorąc pod uwagę, że łatwo jest zdobyć dla niego intellisense. –

+0

Nie ma intellisense dla zawartości viewbag, nie ma dla modelu strony. Jeśli to nie wystarczy, naprawdę nie mogę ci pomóc. Przypomnij mi, żebym nigdy nie pracował nad którymś z projektów, nad którymi pracowałeś, chyba że wyrwę wszystkie słabe pisanie, więc mam nadzieję, że uda mi się je utrzymać. Jeśli myślisz, że chodzi o "kłopot", brakuje ci sensu. –

+1

Jeśli zadeklarujesz to w widoku, masz intellisense w taki sam sposób, jakbyś zrobił viewmodel. Typ worka widoku jest taki, jaki został podany - wiesz, jaki obiekt mu dałeś, aby zrobić ten sam obiekt w widoku. Jeśli masz listę obiektów, na przykład deklarujesz tę listę w widoku u góry strony i wysyłasz do niej widok. Mogę zrobić viewmodel lub viewbag - żadna nie jest o wiele lepsza do oglądania niż druga. Intellisense z pewnością nie stanowi problemu, chyba że użyjesz viewboksa bezpośrednio na widoku. –