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 em> 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)?
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.
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.
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.
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 .
Tags und Links asp.net-mvc viewmodel