ASP.NET MVC-Modell vs ViewModel

92

OK, ich habe eine Diskussion über "ViewModels" in Bezug auf ASP.NET MVC von MS gehört.

Nun, das soll eine bestimmte Art von Modell sein, richtig? Keine bestimmte Art von Ansicht.

Nach meinem Verständnis handelt es sich um eine Art Modell, das einen bestimmten Zweck der Interaktion mit der Ansicht hat. Oder etwas ähnliches?

Eine Klarstellung wäre willkommen.

Qcom
quelle

Antworten:

71

Im Wesentlichen sind Modell und Ansichtsmodell einfache Klassen mit Attributen.

Das Hauptziel dieser Klassen besteht darin, ein Objekt für ihre jeweilige Zielgruppe zu beschreiben (zu "modellieren"), die jeweils der Controller und die Ansicht sind.

Sie haben also vollkommen recht, wenn Sie sagen

Nach meinem Verständnis handelt es sich um eine Art Modell, das einen bestimmten Zweck der Interaktion mit der Ansicht hat

Während Modellklassen effektiv Domänenentitäten sind, mit denen Ihre Anwendung interagiert, sind Ansichtsmodelle einfache Klassen, mit denen Ihre Ansichten interagieren.

Ich hoffe es hilft :)

Update :

Microsoft hat eine spezielle Version des Präsentationsmusters von Martin Fowler entwickelt, die weitgehend auf dem Model-View-Controller basiert und als Model-View-ViewModel (MVVM) für PF-Anwendungen bezeichnet wird. Dieses Muster richtet sich an moderne UI-Entwicklungsplattformen, bei denen UI-Entwickler andere Anforderungen haben, die mehr auf Geschäftslogik als auf herkömmlichen Entwicklern basieren. Schauen Sie sich hier ein bisschen Theorie an

Lorenzo
quelle
1
OK, danke und auch danke für das Update, das ist sehr hilfreich! Platzieren Sie ViewModels ohne Berücksichtigung der speziellen Version von MS mit Standard-MVC 2 in einem speziellen, dafür vorgesehenen Ordner? Oder werden sie im Wesentlichen wie alle anderen direkt in den Ordner "Modelle" verschoben. Oder kannst du das auch?
Qcom
Bitte schön. Normalerweise platziere ich Modelle und zeige Modelle in demselben Ordner, weil ich sie in Bezug auf die Domäne, auf die sie sich beziehen, zusammenfassen möchte, aber das ist nur meine Wahl und ich bin sicher, dass es bessere gibt
Lorenzo
5
ViewModel soll View vom (Domänen-) Modell trennen. Daher ist es sinnvoll, ViewModel in der Nähe von View und nicht in der Nähe von Model zu platzieren.
Vitaliy Ulantikov
Ich würde meine 'Model'-Klassen außerhalb meines MVC-Projekts und nicht in einem Model-Ordner belassen. Ich würde jedoch die View Model-Klassen innerhalb des MVC-Projekts belassen, damit sie sich, wie Vitaliy sagt, in der Nähe der View befinden.
Dan Harris
@ Lorenzo In deiner ersten Zeile sagst du "beide einfachen Klassen mit Attributen". Ich denke du meinst mit Eigenschaften? Wenn nicht, auf welche Attribute haben Sie sich bezogen? Attribute vs. Eigenschaften
xr280xr
69

Im einfachsten Sinne denke ich gerne an Folgendes:

Modell: Sieht genau wie Ihr Datenmodell aus und fühlt sich auch so an. In jeder Hinsicht ist es nur eine Klassendarstellung Ihres Datenmodells. Es hat keine Kenntnis von Ihrer Ansicht oder von Elementen in Ihrer Ansicht. Das heißt, es sollte keine Attributdekoratoren (dh Erforderlich, Länge usw.) enthalten, die Sie für Ihre Ansicht verwenden würden.

Ansichtsmodell: Dient als Datenordner zwischen Ihrer Ansicht und Ihrem Modell und ist in vielen Fällen auch ein Wrapper für Ihr Modell. Ohne die Ansicht wird sie unbrauchbar, sodass sie normalerweise nicht wie ein Standardmodell für mehrere Ansichten und Controller wiederverwendbar ist.

Beispielsweise kann Ihr Modell die folgenden Eigenschaften aufweisen, die eine direkte Darstellung Ihrer Datenquelle darstellen:

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

Da Ihr Ansichtsmodell nun an Ihre Ansicht gebunden ist, verfügt es möglicherweise über die folgende Eigenschaft, mit der das Feld Vorname und Nachname des Modells als eine Zeichenfolge verknüpft werden:

    [Display(Name = "Customer Name")]                
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}
Jason Marsell
quelle
2
Könnten Sie ein ausführlicheres Beispiel für das ViewModel liefern? Woher weiß es, was myModel ist und wie erhält es Daten für myModel?
M Kenyon II
5
Ein ViewModel ist von Natur aus ein einfaches altes C # -Objekt (POCO) und wird nie wirklich wissen, wie Ihr Datenmodell aussieht. Es ist eher eine Mischung aus Ihrem Datenmodell und bestimmten Elementen, die Ihre Ansicht anzeigen muss. Soweit es Daten erhält, müssen Sie es mit den Daten laden. Ich verwende gerne eine separate Zwischenklasse, in der ich meinen Dienst für die Daten aufrufe und diese Daten dann manuell in mein ViewModel lade. Ich kehre dann das vollständig geladene ViewModel zur Controller-Aktion zurück.
Jason Marsell
26

Ich fand diesen Artikel eine sehr nützliche Ressource, um zu verstehen, wie das "Domänenmodell" und das "Ansichtsmodell" in einer MVC-Anwendung interagieren, insbesondere im Hinblick auf die Bindung. Das Beste von allem sind Beispiele anstelle von abstrakten Beschreibungen.

"Seit der Veröffentlichung von MVC habe ich viel Verwirrung darüber festgestellt, wie Ansichtsmodelle am besten erstellt werden können. Manchmal ist diese Verwirrung nicht ohne Grund, da es nicht viele Informationen zu Best-Practice-Empfehlungen zu geben scheint. Darüber hinaus gibt es keine In diesem Beitrag werde ich einige der wichtigsten Muster und die Vor- und Nachteile der einzelnen Muster beschreiben. Es ist wichtig zu beachten, dass viele dieser Muster vorhanden sind sind aus Menschen hervorgegangen, die Probleme der realen Welt gelöst haben. "

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

Misteraidan
quelle
19

WikiPedia bietet eine vollständigere Beschreibung von Model vs. ModelView als in einer SO-Antwort: http://en.wikipedia.org/wiki/Model_View_ViewModel

Ich zitiere:

Modell : Wie im klassischen MVC-Muster bezieht sich das Modell entweder auf (a) ein Objektmodell, das den Realzustandsinhalt darstellt (ein objektorientierter Ansatz), oder (b) die Datenzugriffsschicht, die diesen Inhalt darstellt (ein Daten-) zentrischer Ansatz).

Ansicht : Wie im klassischen MVC-Muster bezieht sich die Ansicht auf alle von der GUI angezeigten Elemente wie Schaltflächen, Fenster, Grafiken und andere Steuerelemente.

ViewModel : Das ViewModel ist ein „Modell der Ansicht“, dh es ist eine Abstraktion der Ansicht, die auch zur Datenbindung zwischen der Ansicht und dem Modell dient. Es könnte als ein spezieller Aspekt eines Controllers (im MVC-Muster) angesehen werden, der als Datenbinder / Konverter fungiert, der Modellinformationen in Ansichtsinformationen umwandelt und Befehle aus der Ansicht in das Modell übergibt. Das ViewModel macht öffentliche Eigenschaften, Befehle und Abstraktionen verfügbar. Das ViewModel wurde mit einem konzeptionellen Status der Daten verglichen, im Gegensatz zum tatsächlichen Status der Daten im Modell.

Ian Mercer
quelle
3
Während es eine Beschreibung von Model und ViewModel gibt, beschreibt dieser Link nur das MVVM-Architekturmuster. Nicht die Unterschiede zwischen Modell und Ansichtsmodelle
Lorenzo
5

Es gibt einen Begriff für ein ViewModel, der jedoch im Allgemeinen nicht mit Asp.net MVC verknüpft ist. MVC verwendet das Model View Controller-Muster, bei dem der Controller Interaktionen verarbeitet, Daten aus dem Modell aufbaut und diese Daten dann zur Anzeige an die Ansicht übergibt.

ViewModels (und das ViewModel-Muster der Modellansicht) sind allgemeiner mit Silverlight und WPF verknüpft. Xaml ist insofern etwas anders, als die Ansichten eine bidirektionale Bindung an die ViewModels herstellen können, sodass die Technologie etwas anders ist. Wenn Sie beispielsweise ein Textfeld an ein Feld binden, während Sie in dieses Textfeld eingeben, wird der Wert des Felds dynamisch aktualisiert. Diese Art der Interaktion ist auf Webseiten nicht wirklich möglich, da Webseiten zustandslos sind.

Die Ähnlichkeit zwischen den beiden Mustern besteht darin, dass beide versuchen, die Logik von der Anzeige zu trennen. Die häufigste Verwendung / der häufigste Grund dafür ist das Testen: Sie möchten in der Lage sein, alle Interaktionen, die ein Benutzer über die Benutzeroberfläche aufruft, über Code (über ein Testframework) auszuführen.

Tsimon
quelle
In dem Buch "Professional ASP MVC 2", das ich gerade lese, wird ViewModel in Kapitel 1 vorgestellt, um die Interaktion zwischen Präsentation und Modell sowohl stark typisiert als auch trocken zu halten. Zu den Microsoft-Autoren gehören Scott Hansleman, Phil Haack und Scott Guthrie.
Berryl
Ich habe in letzter Zeit viel mehr gesehen, dass das ViewModel in Asp.net MVC verwendet wird. Es scheint, dass das ViewModel mehr Geschäft in der Ansicht hat als das Domänenmodell. Das Muster, das wir verwendet haben, besteht darin, dass die Domänenmodelle die Hauptteile des ViewModel zusammensetzen. Derzeit verwenden wir ein modifiziertes Befehlsmuster (Operationen), die mit den Domänenmodellen zusammenarbeiten, um ihre Aufgaben auszuführen. Die Ergebnisse werden im ViewModel zusammengestellt und an die Ansicht gesendet. Das Ansichtsmodell enthält in diesem Fall alle Anmerkungen und die einfache, fokussierte Logik, die die Ansicht unterstützen.
Sinaesthetic