2010-02-10 6 views
28

Je cherche des opinions sur deux approches différentes de la définition ViewModelplat vs Nested ViewModel classes dans ASP.NET MVC

J'ai une classe de la société

public class Company 
{ 
    public string Name { get; set; } 
    public int CountryID { get; set; } 
} 

Pour les Créer et Éditer les I besoin d'une liste de pays pour remplir une DropDownList pour la sélection de CountryID. Je peux voir deux grands choix pour structurer le ViewModel qui sont détaillés ci-dessous.

Nested ViewModel

public class CompanyCreateEditViewModel 
{ 
    public Company Company { get; set; } 
    public IEnumerable<Country> Countries{ get; set; } 
.... 
} 

plat ViewModel

public class CompanyCreateEditViewModel 
{ 
    public string Name { get; set; } 
    public int CountryID { get; set; } 
    public IEnumerable<Country> Countries{ get; set; } 
.... 
} 

À l'heure actuelle, je suis en faveur de l'approche qu'il me Nested sauve de la définition des champs pour une deuxième fois, mais je veux pour l'ouvrir à de meilleures approches et commentaires.

Merci

Répondre

21

Personnellement, je préfère l'approche imbriquée pour la présentation car elle conduit à une conception plus logique lorsque vous utilisez une vue partielle. Vous pouvez avoir un CompanyPartialView utilisé dans toute l'application qui sait comment rendre un Company, donc cela a beaucoup de sens d'exposer le Company comme une structure imbriquée. D'autre part, les classes ViewModel plates sont les plus faciles à utiliser pour les données entrée. Vous avez juste un tas de champs de formulaire qui correspondent tous à des propriétés individuelles. Ma stratégie consiste donc généralement à les aplatir pour les pages d'entrée de données et à les imbriquer pour les pages de présentation/rapport.

+1

Entièrement d'accord. J'utilise imbriqué pour la présentation - 'CompanyViewModel' - et plat pour la saisie de données -' CompanyCreateEditViewModel'. –

+0

@JarrettMeyer Utilisez-vous AutoMapper pour un modèle de vue imbriqué et plat? Y a-t-il un problème? Je suis juste curieux, j'ai une mauvaise expérience lors de l'utilisation AutoMapper avec viewmodel imbriqué – Willy

+0

J'ai une mauvaise expérience en utilisant AutoMapper tout autour ... – Worthy7

5

Je préfère imbriqué, pour plusieurs raisons:

  • C'est ce que orienté objet est tout au sujet.
  • Si vous utilisez LINQ to SQL ou Entities, ou un ORM, vous pouvez simplement passer les objets ORM et ne pas avoir à transmettre toutes sortes de propriétés.
  • Vous pouvez transmettre d'autres vues, vous pouvez donc créer des modèles distincts pour des vues partielles et, si cette vue utilise un partiel, vous pouvez passer la classe de modèle de vue partielle en tant que propriété de la classe de modèle de vue.

IMHO, HTH.

+0

donnez-vous le modèle entier à la vue partielle ou seulement le nécessaire? Je pense que donner seulement le modèle de vue imbriqué est correct, mais automapper n'est pas capable de reconnaître que les propriétés de la vue partielle sont des membres du modèle imbriqué – Muflix

+1

Cela dépend. De quoi a besoin la vue partielle? Est-ce que la vue partielle fait partie d'un formulaire plus grand (alors vous auriez besoin du modèle entier pour que le chemin d'identification fonctionne correctement). Si la vue partielle est autonome, la conserver isolée dans le sous-modèle est OK.Dans votre exemple, si vous avez besoin de AUtoMapper pour reconnaître certaines propriétés, cela peut sembler une raison de passer le modèle entier, éventuellement. –

+0

Merci Brian. – Muflix

Questions connexes