2010-01-19 9 views
7

Jestem początkującym programistą MVC ASP.NET, ale użyłem wcześniej wielu frameworków Model-View-Controller.Terminologia ASP.NET MVC potknęła się o mnie - dlaczego "ViewModel"?

I recently came across konwencję zbierając kawałki danych, że szczególne potrzeby view (rzeczywiście, jest to przypisane do ViewData) do nowej klasy o nazwie (NameOfView) ViewModel.

Gromadzenie tych danych w celu powiązania ich z funkcjami udostępnianymi przez interakcję Widok/Kontroler uderza mnie jako strukturę pomocniczą, a nawet mechanizm zamykający (w znaczeniu "enkapsuluje zbiór zmiennych").

Dlaczego więc nazywa się "ViewModel", ponieważ nie jest to widok ani model?

Czy ktoś inny uważa to imię za mylące?

EDIT: Co się stało z tylko wprowadzenie właściwości na widoku tak, że kontroler może je wypełnić (jak w innych ram MVC)?

+1

+1 więc rep nie będzie już liczbę Bestii – iandisme

+0

Ha ha ha ha You Rock! :-) – JBRWilkinson

Odpowiedz

10

Model jest niezależną od widoku reprezentacją danych. Model widoku jest reprezentatywną dla widoku reprezentacją danych: jest to model , który może wyglądać z punktu o danym widoku.

Rozważmy model składający się z nieprzetworzonych punktów danych; widok histogramu może wówczas mieć model widoku składający się z zestawu segmentów i sum z tych danych.

Logicznie rzecz biorąc, jest to podzbiór lub transformacja modelu - może być generowany na żądanie przy użyciu funkcji specyficznej dla widoku, a model jako jedyne dane wejściowe.

Co do właściwości widoku a worka z nieruchomościami lub obiektu niestandardowego ... Jestem pewien, że ktoś ma na to silne uczucia, ale osobiście nie widzę dużej różnicy. Tworzysz widok reprezentatywny dla modelu i przekazujesz go w postaci w jakiś sposób; dokładny mechanizm nie wydaje się taki ważny.

+1

"Logicznie, jest to podzbiór lub transformacja modelu" lub połączenie wielu modeli –

+0

Czy jest to konwencja ASP.NET MVC, czy jest to branża? – JBRWilkinson

+2

Nie wierzę, że jest w tym coś specyficznego dla ASP.NET ... Wyszukiwarka Google okazuje jednak wiele odniesień do WPF. To wzór; można go wykorzystać do wszystkiego. – Shog9

12

W moim czytaniu na ten temat natknąłem się na wiele argumentów, dlaczego programista chciałby lub nie chciałby użyć modelu ViewModel. Niektórzy nawet twierdzą, że ViewModel should never expose anything more than strings. W tym momencie nie jestem aż tak ekstremalny w swoim myśleniu. Zgadzam się jednak, że nie jest dobrym pomysłem wystawienie Domeny/Obiektów Rdzeniowych na widok. Po pewnym doświadczeniu z pierwszej ręki czuje się czystszy, aby usunąć tę zależność.

Chociaż nie zgadzam się ze wszystkim poniżej Daniel Korzeń sprawia a pretty good case for a ViewModel:

Większość MVC przykłady pokazują bezpośrednio za pomocą klasę modelu, takie jak klasy LINQ-SQL lub Entity Framework. Okablowanie Visual Studio dla MVC kieruje nawet do tej koncepcji z domyślnym generowaniem kodu "Dodaj widok", co pozwala na szybkie generowanie widoków na podstawie jednej klasy modelu . Jednak w aplikacjach świata rzeczywistego często potrzebujesz więcej niż danych z pojedynczej tabeli do zbudowania strony na .Niektóre przykłady dostać wokół tego przez farsz danych wtórnych do ViewData, ale lepszym sposobem zrobić jest utworzyć klasę „roll-up” do zawierają właściwości wszystko twój widok będzie potrzebować. Ma to dodatkową zaletę polegającą na tym, że jest silniej wpisane, co oznacza, że ​​ może być testowalne, a definiuje dokładnie to, czego potrzebuje widok.

Jeff Handley podaje ładny opis ViewModel pattern, który, jak twierdzi, może być używany w połączeniu z MVC.

Edit
I niedawno przyniósł moje myślenie zgodnie z Jimmy Bogard's dotyczących widoków modeli. Po dużej ilości bólu przy każdej implementacji wypróbowałem having one view model per view creates o wiele czystsze doświadczenie programistyczne.

0

Nazywa się to, ponieważ jest to "model wykonany dla widoku". Rozumiem, dlaczego wybór terminu jest nieco mylący.

Jest to pomocne podejście, jeśli nie chcesz, aby wszystkie Twoje dane były przekazywane do widoku jako duża tablica skrótów. Daje ci mocno napisaną klasę poświęconą interfejsowi, który nie zanieczyszcza ani podstawowego modelu, ani widoku. Pozwala również na enkapsulację logiki interfejsu użytkownika - widoki powinny być kept dumb.

+0

"poglądy powinny być głupie" - oczywiście, dlatego mamy Kontrolerów. Odwoływany artykuł używa konstruktów takich jak "if (ViewModel.MeaningfulFlag) {do this} else {do ​​that}; ' w celu uniknięcia "umieszczenia logiki biznesowej w widoku". W jaki sposób jest to "lepsze" niż ustawienie przez kontrolera równoważnej właściwości w rzeczywistym widoku? – JBRWilkinson

2

Powód: dlaczego kontroler nie może wypełnić właściwości w widoku?

Ponieważ widok nie istnieje w chwili wykonywania czynności kontrolera. Pomysł zwrócenia działania ActionResult z działania jest taki, że coś później w przetwarzaniu potwierdzi wyniki i określi najlepszy sposób działania (np. Renderowania widoku lub wyboru widoku pasującego do żądania (np. pomysłowość)).

Zrobiłem postów widokowych na temat wyboru odpowiedniego rodzaju obiektu modelu tutaj: Umieszczenie M w MVC Part I, Part II, Part III.

I tak, termin "ViewModel" jest teraz en vogue, ale jest w duchu oryginalnych użytkowników MVC miał na myśli.