478 votes

Qu'est-ce que le ViewModel en MVC ?

Je suis nouveau dans ASP.NET MVC. J'ai un problème à comprendre l'objectif d'un ViewModel.

Qu'est-ce qu'un ViewModel et pourquoi avons-nous besoin d'un ViewModel pour une application ASP.NET MVC?

Si j'obtiens un bon exemple de son fonctionnement et une explication, ce serait mieux.

4 votes

Cette publication est ce que vous cherchez - "Qu'est-ce qu'un ViewModel ASP.NET MVC?"

6 votes

Cet article semble génial : rachelappel.com/…

0 votes

14voto

Sheo Narayan Points 31

Beaucoup d'exemples importants, laissez-moi expliquer de manière claire et concise.

ViewModel = Modèle créé pour servir la vue.

La vue ASP.NET MVC ne peut pas avoir plus d'un modèle, donc si nous devons afficher des propriétés de plus d'un modèle dans la vue, ce n'est pas possible. ViewModel sert à cela.

View Model est une classe de modèle qui ne peut contenir que les propriétés nécessaires à une vue. Il peut également contenir des propriétés de plus d'une entité (tables) de la base de données. Comme son nom l'indique, ce modèle est créé spécifiquement pour les besoins de la Vue.

Quelques exemples de View Models sont ci-dessous

  • Pour lister des données de plusieurs entités dans une page de vue - nous pouvons créer un modèle de vue et avoir des propriétés de toutes les entités pour lesquelles nous voulons lister les données. Joindre ces entités de base de données et définir les propriétés du modèle de vue et retourner à la vue pour afficher les données de différentes entités sous forme tabulaire
  • Le modèle de vue peut définir uniquement des champs spécifiques d'une seule entité nécessaires pour la vue.

ViewModel peut également être utilisé pour insérer et mettre à jour des enregistrements dans plus d'une entité, cependant l'utilisation principale de ViewModel est d'afficher des colonnes de plusieurs entités (modèles) dans une seule vue.

La manière de créer un ViewModel est la même que pour créer un Modèle, la manière de créer une vue pour le ViewModel est la même que pour créer une vue pour un Modèle.

Voici un petit exemple de Liste des données en utilisant un ViewModel.

J'espère que cela vous sera utile.

13voto

Mayank Points 151

La classe View model a est une classe simple qui peut contenir plus d'une propriété de classe. Nous l'utilisons pour hériter de toutes les propriétés requises, par exemple j'ai deux classes Étudiant et Matière

Public class Student
{
public int Id {get; set;}
public string Name {get; set;}
}  
Public class Subject
{
public int SubjectID {get; set;}
public string SubjectName {get; set;}
}

Maintenant nous voulons afficher les enregistrements du nom de l'étudiant et du nom de la matière dans la Vue (dans MVC), mais il n'est pas possible d'ajouter plus d'une classe comme:

 @model ProjectName.Model.Student  
 @model ProjectName.Model.Subject

le code ci-dessus générera une erreur...

Maintenant nous créons une classe et nous pouvons lui donner n'importe quel nom, mais ce format "XyzViewModel" le rendra plus facile à comprendre. C'est un concept d'héritage. Maintenant nous créons une troisième classe avec le nom suivant:

public class StudentViewModel:Subject
{
public int ID {get; set;}
public string Name {get; set;}
}

Maintenant nous utilisons ce ViewModel dans la Vue

@model ProjectName.Model.StudentViewModel

Maintenant nous sommes en mesure d'accéder à toutes les propriétés de StudentViewModel et de la classe héritée dans la Vue.

0 votes

Oui, je suis d'accord avec tout, mais vous ne montrez pas comment rendre significatives les propriétés VM (comme dans le contrôleur et/ou dans un service/interface). C'est une partie importante pour pouvoir utiliser les VM dans asp.net MVC.

11voto

Jeroen Points 716

MVC n'a pas de modèle de vue : il a un modèle, une vue et un contrôleur. Un ViewModel fait partie de MVVM (Modèle-Vue-ViewModel). MVVM est dérivé du Modèle de Présentation et est popularisé en WPF. Il devrait également y avoir un modèle dans MVVM, mais la plupart des gens ratent complètement le point de ce modèle et n'auront qu'une vue et un view model. Le modèle dans MVC est similaire au modèle dans MVVM.

Dans MVC, le processus est divisé en 3 responsabilités différentes :

  • La vue est responsable de présenter les données à l'utilisateur
  • Un contrôleur est responsable du flux de la page
  • Un modèle est responsable de la logique métier

MVC n'est pas très adapté pour les applications web. C'est un modèle introduit par Smalltalk pour créer des applications de bureau. Un environnement web se comporte complètement différemment. Il n'a pas beaucoup de sens de copier un concept vieux de 40 ans du développement de bureau et de le coller dans un environnement web. Cependant, beaucoup de gens pensent que c'est ok parce que leur application compile et renvoie les bonnes valeurs. À mon avis, ce n'est pas suffisant pour déclarer un choix de conception comme étant ok.

Un exemple d'un modèle dans une application web pourrait être :

public class LoginModel
{
    private readonly AuthenticationService authentication;

    public LoginModel(AuthenticationService authentication)
    {
        this.authentication = authentication;
    }

    public bool Login()
    {
        return authentication.Login(Username, Password);
    }

    public string Username { get; set; }
    public string Password { get; set; }
}

Le contrôleur peut l'utiliser comme ceci :

public class LoginController
{
    [HttpPost]
    public ActionResult Login(LoginModel model)
    {
        bool success = model.Login();

        if (success)
        {
            return new RedirectResult("/dashboard");
        }
        else
        {
            TempData["message"] = "Nom d'utilisateur et/ou mot de passe invalide";
            return new RedirectResult("/login");
        }
    }
}

Vos méthodes de contrôleur et vos modèles seront petits, facilement testables, et pertinents.

0 votes

Merci pour cet aperçu de l'architecture MVVM, mais pourquoi MVC ne va-t-il pas? Votre raisonnement est douteux et soupçonneux de favoritisme. Certes, je ne sais rien sur le MVVM, mais si une architecture comme le MVC peut imiter le comportement sans avoir à écrire 50k lignes de code, alors quel est le problème?

0 votes

@Chef_Code: Ce n'est ni discutable ni favoritisme : il suffit de lire l'article original sur le MVC. Revenir à la source est bien mieux que de suivre aveuglément le troupeau sans poser de questions (aussi appelé "meilleures pratiques"). Le MVC est destiné à des unités beaucoup plus petites : par exemple, un bouton sur un écran est composé d'un modèle, d'une vue et d'un contrôleur. Dans le Web-MVC, toute la page a un contrôleur, un modèle et une vue. Le modèle et la vue sont censés être connectés, de sorte que les changements dans le modèle sont immédiatement reflétés dans la vue et vice versa. L'imitation est très importante. Une architecture ne devrait pas mentir à ses développeurs.

1 votes

@jeroen L'acronyme MVC a été volé et déformé. Oui, MVC n'a pas de VM mais il n'a pas non plus de Référentiel ou de couche de service, et ces objets sont largement utilisés dans les sites web. Je crois que l'auteur de la question demande "comment introduire et utiliser un VM dans MVC". Dans le nouveau sens de MVC, un modèle n'est pas l'endroit où se trouve la logique métier. La logique métier appartient à une couche de service pour une application web ou desktop utilisant MVC ou MVVM. Le terme modèle décrit les objets métier qui sont passés de/vers la couche de service. Ces définitions sont très différentes de la description originale de MVC.

7voto

gsivanov Points 103

ViewModel est une solution de contournement qui corrige la maladresse conceptuelle du framework MVC. Il représente la 4ème couche de l'architecture Modèle-Vue-Contrôleur à 3 couches. lorsque le Modèle (modèle de domaine) n'est pas approprié, trop grand (plus de 2 à 3 champs) pour la Vue, nous créons un ViewModel plus petit à passer à la Vue.

2voto

Sagar Shinde Points 99

ViewModel est une classe que nous pouvons utiliser pour rendre des données sur View. Supposons que vous avez deux entités Place et PlaceCategory et que vous voulez accéder aux données des deux entités en utilisant un seul modèle, alors nous utilisons ViewModel.

public class Place
    {
       public int PlaceId { get; set; }
        public string PlaceName { get; set; }
        public string Latitude { get; set; }
        public string Longitude { get; set; }
        public string BestTime { get; set; }
    }
    public class Category
    {
        public int ID { get; set; }
        public int? PlaceId { get; set; }
        public string PlaceCategoryName { get; set; }
        public string PlaceCategoryType { get; set; }
    }
    public class PlaceCategoryviewModel
    {
        public string PlaceName { get; set; }
        public string BestTime { get; set; }
        public string PlaceCategoryName { get; set; }
        public string PlaceCategoryType { get; set; }
    }

Donc dans l'exemple ci-dessus, Place et Category sont les deux entités différentes et PlaceCategory ViewModel est le ViewModel que nous pouvons utiliser sur View.

0 votes

Vos exemples ne sont pas très clairs. Ce qui est indiqué ci-dessus est qu'un ViewModel relie les données à sa vue. Si vous regardez les ViewModels dans BlipAjax, vous verrez des classes qui lui correspondent parfaitement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X