Modèle ASP.NET MVC vs ViewModel

92

OK, j'ai entendu parler de "ViewModels" en ce qui concerne ASP.NET MVC de MS.

Maintenant, c'est censé être un type spécifique de modèle, n'est-ce pas? Pas un type de vue spécifique.

À ma connaissance, c'est une sorte de modèle qui a un but spécifique d'interagir avec la vue? Ou quelque chose comme ça?

Des éclaircissements seraient appréciés.

Qcom
la source

Réponses:

71

Le modèle et le modèle de vue sont essentiellement des classes simples avec des attributs.

L'objectif principal de ces classes est de décrire (à «modéliser») un objet pour leurs publics respectifs qui sont respectivement le contrôleur et la vue.

Donc tu as tout à fait raison quand tu dis

À ma connaissance, c'est une sorte de modèle qui a pour but spécifique d'interagir avec la vue

Ainsi, alors que les classes de modèle sont effectivement des entités de domaine avec lesquelles votre application interagit, les modèles de vue sont des classes simples avec lesquelles vos vues interagissent.

J'espère que ça aide :)

Mise à jour :

Microsoft a développé une version spécialisée du Presentation Pattern de Martin fowler en grande partie basée sur le Model-View-Controller et l'a appelé Model-View-ViewModel (MVVM) pour l'application PF. Ce modèle est destiné aux plates-formes de développement d'interface utilisateur modernes où les développeurs d'interface utilisateur ont des exigences différentes basées davantage sur la logique métier que les développeurs traditionnels. Jetez un œil ici pour un peu de théorie

Lorenzo
la source
1
OK, merci, et merci aussi pour la mise à jour, c'est très utile! Donc, sans prendre en compte la version spéciale de MS, avec le stock MVC 2, placez-vous ViewModels dans un dossier spécial et désigné? Ou sont-ils essentiellement insérés directement dans le dossier Modèles comme tous les autres. Ou pouvez-vous faire l'un ou l'autre?
Qcom
Je vous en prie. Habituellement, je place les modèles et les visualise dans le même dossier parce que je veux les regrouper par rapport au domaine auquel ils se réfèrent mais c'est juste mon choix et je suis sûr qu'il y a mieux
Lorenzo
5
ViewModel est censé séparer la vue du modèle (domaine). Il est donc logique de placer ViewModel près de View, pas près de Model.
Vitaliy Ulantikov
Je garderais mes classes 'Model' en dehors de mon projet MVC plutôt que dans un dossier Model - je garderais cependant les classes View Model à l'intérieur du projet MVC, de sorte que, comme Vitaliy le dit, elles seront proches de la vue.
Dan Harris
@Lorenzo Sur votre première ligne, vous dites «les deux classes simples avec des attributs». Je pense que tu veux dire avec les propriétés? Sinon, à quels attributs faisiez-vous allusion? Attributs par rapport Propriétés
xr280xr
69

Dans le plus simple des termes, j'aime penser à ce qui suit:

Modèle: ressemble et ressemble strictement à votre modèle de données. À toutes fins utiles, il ne s'agit que d'une représentation de classe de votre modèle de données. Il n'a aucune connaissance de votre vue ou de tout élément de votre vue. Cela dit, il ne doit contenir aucun décorateur d'attribut (c'est-à-dire obligatoire, longueur, etc.) que vous utiliseriez pour votre vue.

Modèle de vue: sert de liant de données entre votre vue et votre modèle et, dans de nombreux cas, est également un wrapper pour votre modèle. Il serait rendu inutile sans la vue, de sorte qu'il n'est généralement pas réutilisable sur plusieurs vues et contrôleurs comme un modèle standard.

Par exemple, votre modèle peut avoir les propriétés suivantes, qui sont des représentations directes de votre source de données:

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

Maintenant, puisque votre modèle de vue est lié à votre vue, il peut avoir la propriété suivante - qui concatène le champ FirstName et le champ LastName du modèle en une seule chaîne:

    [Display(Name = "Customer Name")]                
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}
Jason Marsell
la source
2
Pourriez-vous fournir un exemple plus complet du ViewModel? Comment sait-il ce qu'est myModel et comment obtient-il des données pour myModel?
M Kenyon II
5
Par nature, un ViewModel est un objet C # simple (POCO) et ne saura jamais vraiment à quoi ressemble votre modèle de données. Il s'agit davantage d'un hybride de votre modèle de données et d'éléments spécifiques que votre vue doit afficher. En ce qui concerne la façon dont il obtient les données, vous devez le charger avec les données. J'aime utiliser une classe intermédiaire distincte, où j'appelle mon service pour les données, puis charge manuellement ces données dans mon ViewModel. Je renvoie ensuite le ViewModel entièrement chargé à l'action du contrôleur.
Jason Marsell
26

J'ai trouvé cet article une ressource très utile pour comprendre comment le «modèle de domaine» et le «modèle de vue» interagissent dans une application MVC, en particulier en ce qui concerne la liaison. Le meilleur de tous inclut des exemples au lieu de descriptions abstraites.

"Depuis que MVC a été publié, j'ai observé une grande confusion sur la meilleure façon de construire des modèles de vue. Parfois, cette confusion n'est pas sans raison car il ne semble pas y avoir une tonne d'informations sur les recommandations de bonnes pratiques. De plus, il n'y a pas une solution "taille unique" qui fait office de solution miracle. Dans cet article, je décrirai quelques-uns des principaux modèles qui ont émergé et les avantages / inconvénients de chacun. Il est important de noter que bon nombre de ces modèles ont émergé de personnes résolvant des problèmes du monde réel. "

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

misteraidan
la source
19

WikiPedia a une description plus complète de Model vs ModelView que celle que vous obtiendrez dans une réponse SO: http://en.wikipedia.org/wiki/Model_View_ViewModel

Je cite:

Modèle : comme dans le modèle MVC classique, le modèle se réfère à (a) un modèle d'objet qui représente le contenu réel de l' état (une approche orientée objet), ou (b) la couche d'accès aux données qui représentent que le contenu (a Data- approche centrée).

Vue : comme dans le modèle MVC classique, la vue fait référence à tous les éléments affichés par l'interface graphique tels que les boutons, les fenêtres, les graphiques et autres contrôles.

ViewModel : le ViewModel est un «modèle de la vue» ce qui signifie qu'il s'agit d'une abstraction de la vue qui sert également à la liaison de données entre la vue et le modèle. Cela pourrait être considéré comme un aspect spécialisé de ce que serait un contrôleur (dans le modèle MVC) qui agit comme un classeur / convertisseur de données qui change les informations du modèle en informations de vue et transmet les commandes de la vue au modèle. Le ViewModel expose les propriétés publiques, les commandes et les abstractions. Le ViewModel a été comparé à un état conceptuel des données par opposition à l'état réel des données dans le modèle.

Ian Mercer
la source
3
Bien qu'il existe une description de Model et ViewModel, ce lien décrit simplement le modèle architectural MVVM. Pas les différences entre Model et View Models
Lorenzo
5

Il existe une notion de ViewModel, mais il n'est généralement pas associé à Asp.net MVC. MVC utilise le modèle Model View Controller, dans lequel le contrôleur gère les interactions, génère des données à partir du modèle, puis transmet ces données à la vue pour affichage.

ViewModels (et le modèle ViewModel Model View) est plus généralement associé à Silverlight et WPF. Xaml est un peu différent en ce que les vues peuvent faire une liaison bidirectionnelle avec les ViewModels, donc la technologie est un peu différente. Par exemple, si vous liez une zone de texte à un champ, à mesure que vous tapez dans cette zone de texte, la valeur du champ est mise à jour dynamiquement. Ce type d'interaction n'est pas vraiment possible dans les pages Web, car les pages Web sont sans état.

La similitude des deux modèles est qu'ils essaient tous deux de séparer la logique de l'affichage. L'utilisation / la raison la plus courante en est le test: vous voulez être en mesure d'effectuer à partir du code (via un framework de test) toutes les interactions qu'un utilisateur appellera via l'interface utilisateur.

Tsimon
la source
Dans le livre que je lis, "Professional ASP MVC 2", ViewModel est présenté au chapitre 1 comme un moyen de conserver les interactions présentation / modèle à la fois fortement typées et DRY. Les auteurs de Microsoft incluent Scott Hansleman, Phil Haack, Scott Guthrie.
Berryl
J'ai vu beaucoup plus, ces derniers temps, que le ViewModel est utilisé dans Asp.net MVC. il semblerait que le ViewModel ait plus d'affaires dans la vue que le modèle de domaine. Ainsi, le modèle que nous avons utilisé consiste à demander aux modèles de domaine d'assembler les principales parties du ViewModel. Actuellement, nous utilisons un modèle de commande modifié (opérations) qui fonctionne avec les modèles de domaine pour effectuer leurs tâches. Les résultats sont assemblés dans le ViewModel et envoyés à la vue. Le modèle de vue dans ce cas contient toutes les annotations et une logique simple et ciblée qui prennent en charge la vue.
Sinaesthetic