ASP.NET MVC Terminologie stolpert mich auf - warum 'ViewModel'?

7

Ich bin ein ASP.NET MVC-Neuling, habe aber schon viele Model-View-Controller-Frameworks verwendet.

Ich kam kürzlich Konvention zum Sammeln der Daten, die Ihre bestimmte Ansicht benötigt (tatsächlich wird sie der ViewData zugewiesen) in einer neuen Klasse namens (NameOfView) ViewModel .

Das Sammeln dieser Daten, so dass sie mit den von der View / Controller-Interaktion bereitgestellten Funktionen verknüpft sind, erscheint mir als Hilfsstruktur oder sogar als Schließmechanismus (im Sinne von "Verkapselung einer Variablensammlung").

Warum heißt es "ViewModel", da es sich weder um eine Ansicht noch um ein Modell handelt?

Findet jemand den Namen verwirrend?

BEARBEITEN : Was ist falsch daran, nur Eigenschaften in die Ansicht zu setzen, damit der Controller sie füllen kann (wie in anderen MVC-Frameworks)?

    
JBRWilkinson 19.01.2010, 18:29
quelle

5 Antworten

10

Das Modell ist eine Ansicht-agnostische Darstellung der Daten. Das view -Modell ist eine sichtspezifische Darstellung der Daten: Es ist das -Modell , wie es von einem bestimmten view -Punkt aus aussehen könnte.

>

Betrachten Sie ein Modell, das aus Rohdatenpunkten besteht; Eine Histogrammansicht könnte dann ein Ansichtsmodell haben, das aus einer Gruppe von Buckets und Summen besteht, die aus diesen Daten gezogen werden.

Logischerweise handelt es sich um eine Teilmenge oder Transformation des Modells - sie könnte bei Bedarf mit einer sichtspezifischen Funktion und dem Modell als einziger Eingabe generiert werden.

Was Eigenschaften in der Ansicht betrifft, im Gegensatz zu einer Eigenschaftstasche oder einem benutzerdefinierten Objekt ... Ich bin mir sicher, dass jemand starke Gefühle dazu hat, aber ich persönlich sehe den großen Unterschied nicht. Sie erstellen eine sichtspezifische Darstellung des Modells und übergeben es irgendwie ; Der genaue Mechanismus scheint nicht so wichtig zu sein.

    
Shog9 19.01.2010, 18:33
quelle
12

Bei meiner Lektüre zu diesem Thema bin ich auf eine Vielzahl von Argumenten gestoßen, warum ein Entwickler ein ViewModel verwenden wollte oder nicht. Einige argumentieren sogar, dass ViewModel sollte nie mehr als Strings aussetzen . An diesem Punkt bin ich nicht so extrem in meinem Denken. Ich stimme jedoch zu, dass es keine gute Idee ist, Domain / Core-Objekte der Ansicht auszusetzen. Nach etwas Erfahrung aus erster Hand fühlt es sich sauberer an, diese Abhängigkeit zu beseitigen.

Obwohl ich nicht mit allem einverstanden bin, macht Daniel Root a ziemlich gut für ein ViewModel :

  

Die meisten MVC-Beispiele werden direkt mit angezeigt   eine Modellklasse wie LINQ-to-SQL   oder Entity Framework-Klasse. Das Visuelle   Studio-Verkabelung für MVC steuert Sie sogar   in dieses Konzept mit seiner Standardeinstellung   "Add View" Code-Generation, die lässt   Sie können schnell Ansichten basierend auf einem   einzelne Modellklasse. Jedoch in   Real-World-Apps braucht man oft mehr   als nur die Daten einer einzelnen Tabelle zu   eine Seite aufbauen. Einige Beispiele bekommen   um dies herum mit sekundären Daten stopfen   in ViewData, aber eine bessere Möglichkeit zu tun   Dies ist, um eine "Roll-up" -Klasse zu erstellen   Eigenschaften für alles enthalten   Deine Sicht wird brauchen. Dies hat die   zusätzliche Vorteile, mehr zu sein   stark typisiert, unterstützend   intellisense, testbar sein und   genau definieren, was eine Ansicht braucht.

Jeff Handley gibt eine schöne Beschreibung des ViewModel Musters was er argumentiert, kann in Verbindung mit MVC verwendet werden.

Bearbeiten
Ich habe vor kurzem meine Gedanken in Übereinstimmung mit Jimmy Bogards Ansichtenmodellen gebracht. Nach einer gehörigen Portion Schmerz bei jeder Implementierung habe ich versucht, mit einem View-Modell pro View erstellt eine viel sauberere Entwicklungserfahrung.

    
ahsteele 19.01.2010 18:56
quelle
2

Re: Warum kann der Controller keine Eigenschaften in der Ansicht auffüllen?

Weil die Ansicht zum Zeitpunkt der Ausführung der Controller-Aktion nicht existiert. Die Idee dahinter, ein ActionResult von Ihrer Aktion zurückzugeben, ist, dass etwas später in der Verarbeitungspipeline das Ergebnis evaluiert und die beste Vorgehensweise bestimmt (vielleicht eine Ansicht rendern oder eine Ansicht auswählen, die der Anfrage entspricht (wie spezielle Ansichten für Mobile) Geräte)).

Ich habe einen Beitrag zur Auswahl der richtigen Art von Modellobjekt hier gemacht: Setzen Sie das M in MVC Teil I , Teil II , Teil III .

Und ja, der Begriff "ViewModel" ist gerade in Mode, aber im Sinne der ursprünglichen MVC-Anwender.

    
OdeToCode 25.01.2010 02:39
quelle
1

Das ist eigentlich keine Antwort, aber ich empfehle euch dringend, das MVC2 Basics Video von Scott Hanselman anzuschauen. Es erklärt alles, und obwohl ich ASP.NET MVC gemacht habe, bevor es viele Dinge für mich klar gemacht hat.

Es ist hier: Ссылка

    
lahsrah 31.10.2010 21:40
quelle
0

Es heißt, weil es ein "Modell für eine Ansicht" ist. Ich verstehe, warum die Wahl des Begriffs ein wenig verwirrend ist.

Dies ist ein hilfreicher Ansatz, wenn Sie nicht möchten, dass alle Ihre Daten als großes Hash-Array an die Ansicht übergeben werden. Sie erhalten eine stark typisierte Klasse für die Benutzeroberfläche, die weder das Kernmodell noch die Ansicht verschmutzt. Es ermöglicht Ihnen auch, UI-Logik zu kapseln - Ansichten sollten dumm gehalten .

    
Matt Sherman 19.01.2010 20:21
quelle

Tags und Links