ASP.NET MVC Model vs ViewModel

92

OK, słyszałem dyskusję o „ViewModels” w odniesieniu do MS ASP.NET MVC.

Otóż, to ma być specyficzny model, prawda? Nie jest to konkretny rodzaj widoku.

W moim rozumieniu jest to rodzaj Modelu, który ma określony cel interakcji z Widokiem? Czy coś takiego?

Byłoby mile widziane pewne wyjaśnienie.

Qcom
źródło

Odpowiedzi:

71

Zasadniczo model i model widoku są prostymi klasami z atrybutami.

Głównym celem tych klas jest opisanie („Modelowanie”) obiektu dla odpowiednich odbiorców, którymi są odpowiednio kontroler i widok.

Więc masz całkowitą rację, kiedy mówisz

W moim rozumieniu jest to rodzaj Modelu, który ma określony cel interakcji z Widokiem

Tak więc, podczas gdy klasy modelu są w rzeczywistości encjami domeny, z którymi współpracuje aplikacja, modele widoków są prostymi klasami, z którymi współdziałają widoki.

Mam nadzieję, że to pomoże :)

Aktualizacja :

Firma Microsoft opracowała wyspecjalizowaną wersję wzorca prezentacji autorstwa Martina Fowlera w dużej mierze opartą na modelu Model-View-Controller i nazwał go Model-View-ViewModel (MVVM) dla aplikacji PF. Ten wzorzec jest przeznaczony dla nowoczesnych platform programistycznych UI, w których programiści UI mają inne wymagania oparte bardziej na logice biznesowej niż tradycyjni deweloperzy. Spójrz tutaj na trochę teorii

Lorenzo
źródło
1
OK, dzięki, a także dzięki za aktualizację, to bardzo pomocne! Tak więc, nie biorąc pod uwagę specjalnej wersji MS, z podstawowym MVC 2, czy umieszczasz ViewModels w specjalnym, wyznaczonym folderze? A może po prostu wrzucono je bezpośrednio do folderu Modele, jak wszystkie inne. A może możesz to zrobić?
Qcom
Zapraszamy. Zwykle umieszczam modele i przeglądam modele w tym samym folderze, ponieważ chcę je zgrupować według domeny, do której się odnoszą, ale to tylko mój wybór i jestem pewien, że są lepsze
Lorenzo
5
ViewModel ma oddzielić widok od modelu (domeny). Dlatego warto umieścić ViewModel w pobliżu widoku, a nie w pobliżu modelu.
Vitaliy Ulantikov
Trzymałbym moje klasy „Model” poza moim projektem MVC, a nie w folderze Model - chciałbym jednak zachować klasy widoku modelu wewnątrz projektu MVC, aby, jak mówi Vitaliy, znajdowały się w pobliżu widoku.
Dan Harris,
@Lorenzo W pierwszym wierszu mówisz „obie proste klasy z atrybutami”. Myślę, że masz na myśli właściwości? Jeśli nie, do jakich atrybutów się odnosiliście? Atrybuty a właściwości
xr280xr
69

Mówiąc najprościej, lubię myśleć o następujących rzeczach:

Model: Ściśle wygląda i działa jak model danych. Pod każdym względem jest to tylko reprezentacja klasowa modelu danych. Nie ma wiedzy o Twoim Widoku ani żadnych elementach w Twoim Widoku. To powiedziawszy, nie powinien zawierać żadnych dekoratorów atrybutów (tj. Wymagane, Długość itp.), Których użyłbyś w swoim Widoku.

Widok modelu: służy jako łącznik danych między widokiem a modelem, aw wielu przypadkach jest również opakowaniem dla Twojego modelu. Byłby bezużyteczny bez widoku, więc zazwyczaj nie można go ponownie użyć w wielu widokach i kontrolerach, tak jak w przypadku standardowego modelu.

Na przykład model może mieć następujące właściwości, które są bezpośrednimi reprezentacjami źródła danych:

    public string FirstName { get; set; }
    public string LastName { get; set; }

Teraz, ponieważ model widoku jest powiązany z widokiem, może mieć następującą właściwość - która łączy pola FirstName i LastName modelu razem jako jeden ciąg:

    [Display(Name = "Customer Name")]                
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}
Jason Marsell
źródło
2
Czy możesz podać pełniejszy przykład ViewModel? Skąd wie, co to jest myModel i jak uzyskuje dane dotyczące mojego modelu?
M Kenyon II
5
Z natury ViewModel jest zwykłym starym obiektem C # (POCO) i nigdy tak naprawdę nie będzie wiedział, jak wygląda Twój model danych. Jest to bardziej hybryda twojego modelu danych i określonych elementów, które twój widok musi wyświetlić. Jeśli chodzi o sposób pobierania danych, musisz załadować go z danymi. Lubię używać oddzielnej klasy pośredniej, w której dzwonię do mojej usługi po dane, a następnie ręcznie ładuję te dane do mojego ViewModel. Następnie zwracam w pełni załadowany ViewModel do akcji kontrolera.
Jason Marsell
26

Uważam, że ten artykuł jest bardzo przydatnym źródłem informacji, w jaki sposób „Model domeny” i „Model widoku” współdziałają w aplikacji MVC, szczególnie w odniesieniu do wiązania. Najlepszy ze wszystkich zawiera przykłady zamiast abstrakcyjnych opisów.

„Odkąd ukazał się MVC, zauważyłem wiele nieporozumień co do tego, jak najlepiej konstruować modele widoku. Czasami to zamieszanie nie jest bez powodu, ponieważ wydaje się, że nie ma mnóstwa informacji na temat zaleceń dotyczących najlepszych praktyk. Ponadto nie ma rozwiązanie „jeden rozmiar dla wszystkich”, które działa jak srebrny pocisk. W tym poście opiszę kilka z głównych wzorców, które się pojawiły, oraz wady / zalety każdego z nich. Należy zauważyć, że wiele z tych wzorców wyłoniły się z ludzi rozwiązujących rzeczywiste problemy ”.

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

misteraidan
źródło
19

WikiPedia ma pełniejszy opis Model vs ModelView niż w odpowiedzi SO: http://en.wikipedia.org/wiki/Model_View_ViewModel

Cytuję:

Model : podobnie jak w klasycznym wzorcu MVC, model odnosi się do (a) modelu obiektowego, który reprezentuje zawartość stanu rzeczywistego (podejście obiektowe), lub (b) warstwy dostępu do danych, która reprezentuje tę zawartość ( podejście centryczne).

Widok : tak jak w klasycznym wzorcu MVC, widok odnosi się do wszystkich elementów wyświetlanych przez GUI, takich jak przyciski, okna, grafika i inne kontrolki.

ViewModel : ViewModel jest „modelem widoku”, co oznacza, że ​​jest abstrakcją widoku, która służy również w powiązaniu danych między widokiem a modelem. Można to postrzegać jako wyspecjalizowany aspekt tego, co byłoby kontrolerem (we wzorcu MVC), który działa jako spinacz / konwerter danych, który zmienia informacje o modelu na informacje o widoku i przekazuje polecenia z widoku do modelu. ViewModel uwidacznia właściwości publiczne, polecenia i abstrakcje. ViewModel został porównany do koncepcyjnego stanu danych w przeciwieństwie do rzeczywistego stanu danych w modelu.

Ian Mercer
źródło
3
Chociaż istnieje opis Model i ViewModel, to łącze opisuje tylko wzorzec architektoniczny MVVM. Nie różnice między modelami i widokami
Lorenzo
5

Istnieje pojęcie ViewModel, ale zazwyczaj nie jest ono związane z Asp.net MVC. MVC używa wzoru kontrolera widoku modelu, w którym kontroler obsługuje interakcje, tworzy dane z modelu, a następnie przekazuje te dane do widoku w celu wyświetlenia.

ViewModels (i wzorzec ViewModel widoku modelu) jest bardziej ogólnie skojarzony z Silverlight i WPF. Xaml jest nieco inny, ponieważ widoki mogą wykonywać dwukierunkowe powiązanie z ViewModels, więc technologia jest nieco inna. Na przykład, jeśli powiążesz pole tekstowe z polem, podczas pisania w tym polu tekstowym wartość pola jest aktualizowana dynamicznie. Ten rodzaj interakcji nie jest naprawdę możliwy na stronach internetowych, ponieważ strony internetowe są bezpaństwowe.

Podobieństwo między tymi dwoma wzorami polega na tym, że oba próbują oddzielić logikę od wyświetlacza. Najczęstszym zastosowaniem / powodem tego jest testowanie: chcesz mieć możliwość wykonywania z kodu (za pośrednictwem struktury testowej) wszystkich interakcji, które użytkownik wywoła za pośrednictwem interfejsu użytkownika.

tsimon
źródło
W książce, którą czytam, „Professional ASP MVC 2”, ViewModel jest wprowadzony w rozdziale 1 jako sposób na zachowanie interakcji prezentacji / modelu zarówno silnie wpisanych na klawiaturze, jak i DRY. Autorzy Microsoft to Scott Hansleman, Phil Haack, Scott Guthrie.
Berryl
Ostatnio widziałem dużo więcej, że ViewModel jest używany w Asp.net MVC. wydawałoby się, że ViewModel ma w widoku więcej biznesów niż model domeny. Tak więc wzorzec, którego używaliśmy, polega na tym, aby modele domeny składały główne części ViewModel. Obecnie używamy zmodyfikowanego wzorca poleceń (operacji), które współpracują z modelami domeny w celu wykonania ich zadań. Wyniki są składane w ViewModel i wysyłane do widoku. Model widoku w tym przypadku zawiera wszystkie adnotacje i prostą, skoncentrowaną logikę, która obsługuje widok.
Sinaesthetic