2009-09-09 8 views
3

J'ai une question concernant la séparation du contrôleur et de la vue. Il me semble que le contrôleur devrait seulement passer un modèle à la vue, et la vue décide comment afficher le modèle. De cette façon, le contrôleur et le modèle restent séparés et peuvent être développés indépendamment. Cependant, beaucoup de tutoriels que je vois en ligne et même dans le livre Pro ASP.NET MVC Framework, je vois beaucoup d'exemples en utilisant soit ViewData ["chaîne"] ou TempData ["chaîne"].Conserver le contrôleur et la vue séparés en utilisant des objets fortement typés

Cela ne présente-t-il pas deux problèmes? La première est que la vue est maintenant couplée au contrôleur en ce sens qu'elle doit connaître le nom des chaînes que le contrôleur est en train de définir dans ViewData/TempData. La seconde est que ceux-ci sont faiblement typés, ce qui signifie qu'il n'y a pas d'Intellisense. Si je développais le contrôleur, je ne peux pas simplement dire à un autre développeur travaillant sur la vue d'utiliser Intellisense pour le modèle, je devrais lui donner le nom des chaînes, et si jamais je change les noms de chaînes, je Je devais aussi le changer dans la vue.

Je suppose que finalement ce que je demande est, est-ce exact? Ou est-ce que je ne comprends pas quelque chose?

Répondre

4

Afficher les données est l'un des moyens de transmettre des informations entre la vue et le contrôleur mais, comme vous l'avez dit, il n'y a pas d'intellisence et cela augmente le couplage. Au lieu de cela, vous devriez envisager d'utiliser un ViewModel. Voir Scott Gu NerdDinner example (disponible gratuitement) sur la façon d'utiliser ViewModel et sur les avantages et les inconvénients de ViewDate vs ViewModel.

J'espère que cela aidera.

+1

Merci pour la réponse! En gros, vous avez tous dit la même chose, mais malheureusement, je ne peux en désigner qu'un comme réponse, alors je l'ai donné au gars ayant le moins de points de réputation. –

+0

Merci beaucoup d'aider le débutant! –

1

Oui, vous avez raison, il est recommandé de créer une classe souvent appelée ViewModel qui est envoyée/utilisée dans la vue. Le ViewModel contient généralement le modèle ainsi que toutes les autres données dont la vue peut avoir besoin, telles que le numéro de page pour une vue de liste paginée ou les valeurs d'une liste pour la vue à afficher.

2

Je pense que les tutoriels et le livre utilisent cette méthode pour essayer de rendre les choses un peu plus faciles à démarrer. Cependant, je suis d'avis que cela pourrait commencer certaines mauvaises habitudes comme vous le suggérez.

La façon dont je le fais à peu près basé sur cette article by Jimmy Bogard:

  • Toutes les vues sont fortement typés
  • Une classe ViewModel spécifique par Voir
  • Le point de vue détermine quelles données sont dans le ViewModel

Je n'utilise pas l'Auto-Mapper comme il le fait. J'utilise généralement une méthode utilitaire pour convertir mon objet Model en l'objet ViewModel associé.

Questions connexes