MVVM ViewModel vs. MVC ViewModel

ViewModel est un terme qui est utilisé à la fois dans MVVM (Model-View-ViewModel) et la mise en œuvre recommandée pour ASP.NET MVC. Rechercher "ViewModel" peut prêter à confusion étant donné que chaque modèle utilise le même terme.

quelles sont les principales différences entre le MVC ViewModel et le MVVM ViewModel? Par exemple, je crois que le MVVM ViewModel est plus riche, étant donné l'absence d'un contrôleur. Est-ce vrai?

32
demandé sur Neil Barnwell 2009-12-21 13:42:41

3 réponses

une question assez difficile à répondre succinctement, mais je vais essayer. (Gardez à l'esprit que les réponses à ce genre de questions font encore l'objet de débats parmi les développeurs.)

dans MVC, le modèle de vue fournit toutes les informations nécessaires pour qu'une vue soit rendue. Les données qu'il contient sont créées à l'aide des données définies dans le modèle. La vue lit le modèle de vue et rend la sortie. L'entrée de la vue est transmise au contrôleur, qui manipule le modèle construit un modèle de vue approprié et le transmet à la vue pour le rendu.

dans MVVM, le ViewModel sert la même fonction que dans MVC, mais il remplace également une partie du contrôleur MVC en fournissant des commandes qui permettent à la vue de manipuler le modèle. WPF databinding gère la mise à jour de la vue en fonction des changements dans le modèle de vue (et cela remplace effectivement la fonction restante du contrôleur MVC).

45
répondu Adam Ralph 2016-01-04 18:02:44

ça fait longtemps que je n'ai pas joué au Bingo Design Patterns.. toutefois, permettez-moi de prendre un coup de couteau à présent..

MVVM est juste quelque chose que MS a inventé... parce que ça vous aide à tirer le meilleur parti de WPF. Vous combinez l'état et le comportement de la vue dans une classe (un modèle de présentation) qui est facilement testable + puis vous utilisez data-binding pour obtenir les données dans n'importe quelle vue.

ce link présente un bref aperçu de l'évolution des MVVM. Combinez cela avec la série " de Fowler "GUI Architectures ", et vous devriez être en route.

mise à jour: ne savait pas qu'il y avait quelque chose appelé MVC-VM . Apparemment une idée du ASP.NET la foule des MVC. Ressemble à MVVM (à l'exception de tuned for ASP.NET MVC); la seule différence est qu'il place une restriction qu'il y a 1:1 cartographie entre VM et View. J'aurais deviné 1:N, mais tout le reste correspond.

8
répondu Gishu 2009-12-21 11:12:28

je sais qu'il s'agit d'une (très) vieille question, mais j'ai été pointé comme un exemple d'utilisation de" View Model " dans le contexte de MVC. Je soutiens que cela est incorrect et peut conduire à la confusion par les gens qui sont nouveaux à l'un ou/ou/les deux modèles. Celui qui est de le faire--stahp. Voici pourquoi (et c'est même une réponse à la question d'origine d'une manière détournée).

un exemple de quand cela se produit peut être vu dans cette question . L'utilisateur essaie de utilisez un modèle de vue qui implémente INotifyPropertyChanged dans un ASP.NET MVC application, ainsi mashing ensemble bureau et sans état conception d'application web dans un échec architectural et cœur brisé.

pour le dire simplement, il n'y a pas de" View Model " dans le modèle MVC. signifie , mais c'est un équivalent fonctionnel, et c'est le contrôleur. Juste pour être clair sur les pièces et leurs buts,

MVVM (desktop applications):

  • modèle - objet fortement typé qui détient des données à passer entre le modèle de vue et de vue
  • Vue - L'INTERFACE utilisateur affichée par l'utilisateur, et à travers laquelle l'utilisateur interagit avec le système
  • View Model - interprète les actions de l'utilisateur (par exemple, via ICommand), les exécute, met à jour l'état de l'application

MVC (applications web):

  • Modèle - Fortement typé* objet qui contient les données à être passé entre la Vue et le Modèle de Vue
  • View - un générateur D'UI qui combine le modèle, le code et HTML pour rendre une page web
  • Controller - Accepte les requêtes de l'utilisateur, les interprète, met à jour l'état de l'application et utilise une vue pour convertir cet état en HTML page web

le modèle est pratiquement le même dans les deux cas. Les modèles bureautiques peuvent mettre en œuvre des notifications d'événements de mise à jour, les Modèles web peuvent être dynamiques (c.-à-d. qu'ils ne sont pas fortement typés), et les deux peuvent inclure ou non des méthodes de validation ou des métadonnées.

la vue sur le bureau est ce que l'utilisateur voit. Dans le web, c'est un générateur qui produit HTML pour les navigateurs à afficher sur le client côté. Il doit interpréter l'interaction de l'utilisateur sur le bureau, mais sur le web qui est géré par javascript côté client, le navigateur, et les requêtes qui sont renvoyées au serveur.

le modèle de Vue/Contrôleur sont à peu près équivalents sur le plan fonctionnel, mais diffèrent grandement dans la façon dont ils sont mis en œuvre et comment ils fonctionnent. dans le modèle de vue , l'interaction de l'utilisateur avec l'application est transférée aux modèles de Vue via ICommands, événements routés, et d'autres méthodes (de nombreux cadres MVVM fournissent différentes façons d'accrocher des modèles de vue à L'UI et d'autres parties de l'application). dans un Controller , une requête arrive avec toutes les informations nécessaires pour que le Controller renvoie un résultat à l'utilisateur (en supposant qu'il s'agisse d'une requête de 200 OK). Le Controller doit effectuer tout le travail nécessaire pour créer l'État (modèle aka) nécessaire au générateur HTML (la vue) pour créer la réponse. Conception-sage, le Le Controller s'assoit au-dessus de la vue et le Model connaissant et contrôlant les deux, tandis que le ViewModel s'assoit à côté de la vue, passant le Model (et d'autres informations) entre eux.

ce qui semble vraiment déconcerter certaines personnes est qu'il ya MVVM côté client cadres que vous pouvez mélanger dans votre application MVC. Ceux-ci existent uniquement en javascript dans le navigateur de l'utilisateur, et n'ont rien à voir avec quelque motif particulier que vous suivez sur le côté serveur. Vous pouvez lancer un site ASP classique qui utilise MVVM du côté client. Vous pouvez lancer des pages HTML statiques qui utilisent MVVM du côté client. Ils sont séparés.

ces cadres MVVM javascript suivent généralement un modèle similaire au modèle MVVM de bureau décrit ci-dessus, mais ajustés pour fonctionner plus en accord avec la nature du DOM HTML et javascript. Par exemple, il n'y a pas de système de reliure étendu tissé dans le DOM, et javascript a un très système de type limité, de sorte que l'appariement des modèles aux modèles est très différent que dans WPF. Ils fonctionnent aussi typiquement déconnectés du serveur, et quand ils ont besoin d'interagir, préfèrent les appels AJAX plutôt que de poster la page vers le contrôleur (les appels AJAX sont généralement traités par les contrôleurs WebAPI en ASP.NET MVC).

donc, pour résumer, il n'y a vraiment pas de modèle de vue dans MVC. Le Controller est l'équivalent approximatif, mais est très différent dans la façon dont il reçoit l'entrée de l'utilisateur, l'interprète, et renvoie un résultat à l'utilisateur. L'utilisation du terme "voir le modèle" pour désigner n'importe quoi dans MVC ne peut que conduire à la confusion, et devrait donc être évitée. Utilisez les bons termes pour les parties appropriées du modèle. Il peut sembler pédant, mais il devrait aider à garder les choses claires et être moins déroutant pour les gens qui sont nouveaux aux deux modèles.

4
répondu Will 2017-05-23 12:10:06