2010-10-21 5 views
8

Je me demande, pourquoi tout le monde hates ViewData? Je trouve cela très utile et pratique. Je vous dis pourquoi: typiquement chaque action de contrôleur a son propre ViewModel, donc il est utilisé une seule fois et je trouve très fastidieux de modifier la classe ViewData chaque fois que j'ai besoin d'ajouter une portion de données à afficher. modifier son constructeur). Au lieu de cela, je peux écrire dans le contrôleurPourquoi tout le monde déteste ViewData?

ViewData["label"] = someValue; 
// in mvc 3 even better: 
ViewData.Label = someValue 

et vue

<%= ViewData["label"] %> 
<%-- mvc 3: --%> 
<%= ViewData.Label %> 

ou pour les types complexes:

<% ComplexType t = (ComplexType)ViewData["label"]; %> // and use all benefits of strong typing 
<%= t.SomeProperty %> 

Rédaction d'une action du contrôleur, je ne dois pas passer à une autre classe, lorsque Je dois ajouter quelques données à voir. Et un gros plus pour moi: ne pas inonder votre projet avec des classes insensées et basculer entre eux et les autres.
Je suis d'accord que l'utilisation de "chaînes magiques" pourrait conduire à des erreurs qui ne sont pas attrapées par le compilateur, mais ces erreurs localisées dans une très petite partie du code et peuvent être découvertes très rapidement. D'ailleurs, comment pensez-vous que les gars qui travaillent avec des langages dynamiques (rails, django) vivent sans avoir à taper du tout?)

Comment jugez-vous l'utilisation de ViewData?

+1

+1 pour acte de bravoure. –

+0

Meh, il essaie juste de se battre avec un consensus. - La comparaison RoR, Django n'est pas juste. Si vous avez un outil (le compilateur) pour vous assurer que votre code est de meilleure qualité, pourquoi ne pas l'utiliser? le RoR, les gars de Django (et je m'y mets) ont probablement beaucoup d'erreurs typo stupides que je n'obtiens pas avec C#. – jfar

Répondre

7

Je pense que cela va au-delà de l'argument de la chaîne magique. Je dirais que ViewModels est une bonne chose et non des classes insensées, car elles aident à garder les vues plus propres et plus faciles à lire qu'à accéder à ViewData partout dans les vues.

Lorsque vous obtenez cinq, dix, vingt éléments de données qui doivent être affichés dans une vue, allez-vous vraiment transmettre toutes ces données en tant que ViewData? Cela rendra votre vue plus difficile à suivre et ces données n'auront aucune signification. Créer un ViewModel et taper fortement la vue sur ce ViewModel ne rendra pas seulement le code plus facile à lire, mais vous n'aurez pas à lancer des objets ViewData partout dans votre code.

Je pense que ViewData est bon pour certains cas, mais quand vous avez affaire à beaucoup de données, vous pouvez facilement en abuser.

+0

D'accord avec vous. Lors de l'utilisation de gros morceaux de données structurées ViewModel est le meilleur endroit pour cela. Mais très souvent ViewModel s'avère être un sac avec différentes données. – kilonet

+0

@kilonet - D'accord, mais au moins vous avez encore l'avantage de taper fortement avec ViewModels, alors qu'avec ViewData vous ne le faites pas. – amurra

5

Weeellll .....

Pourquoi ne pas écrire des classes de cette façon?

public dictionary<string, object> myCollectionOfClasses; 
myCollectionOfClasses.Add("MyClass", new MyClass); 

public class MyClass 
{ 
    public string DoSomething 
    { 
     return "SomeString"; 
    } 
} 

Vous devez les appeler ainsi:

string myString = myCollectionOfClasses["MyClass"].DoSomething(); 

Maintenant, ce qui est plus bête?

Voir aussi
How we do MVC – View models

+0

votre exemple ne ressemble pas à la situation avec Views, Controllers et ViewModels dans MVC. ViewModels - est un niveau de code supplémentaire entre Views et Controllers. Pourquoi je ne l'aime pas - j'ai écrit dans mon message, et je pense que l'utilisation de dictionnaire en mvc - un compromis raisonnable. – kilonet

+1

C'est juste un moyen pratique de sectionner la complexité de l'application ... Diviser et conquérir, si vous voulez. Pour moi, un grand avantage de fournir des classes ViewModel est de 1) documenter les informations qui seront utilisées dans la vue, et 2) fournir un endroit pour mettre la logique de vue. Vous ne pouvez pas faire l'un de ceux avec un dictionnaire ViewData. Et oui, j'aime l'intellisense que vous obtenez lorsque vous utilisez un objet ViewModel. Si cela vous semble être un gros travail, vous pouvez utiliser Automapper pour mapper les objets de votre modèle de domaine à vos objets ViewModel. –

+0

Voir aussi http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/06/29/how-we-do-mvc-view-models.aspx –

1

tout d'abord, impressionnant +1 pour me laisser savoir comment MVC3 fait vidéotex! Je voulais trouver un moyen de faire quelque chose comme ça dans MVC2.
En ce qui concerne pourquoi viewdata est mauvaise? Je ne pense pas que ce soit aussi longtemps qu'il est utilisé de façon clairsemée et est testé dans les attentes. 1) L'échec de l'inclusion de viewdata entraîne des exceptions sur une vue qui ne sont pas interceptées par le compilateur. Je me suis aidé avec ce problème en ne pas utiliser la plus voûtée modèle T4MVC (altho je le recommande) et au lieu « écrire » quelque chose me similaire:

 /// <summary> 
     /// Main Greeting 
     /// ViewData: ViewDataConstants.Message 
     /// </summary> 
     public const string Index = "~/Views/Home/Index.aspx"; 

Avec cela, mon IntelliSense me donnera une tête quand je retourne this.View (ViewConstants.Home.Index); Si je connaissais assez T4 pour modifier T4MVC pour faire cela pour moi, je retournerais à ce que cela soit généré;)

2) Les typos sont une douleur. C'est pourquoi, comme vous le verrez ci-dessus, j'utilise une classe statique non seulement pour les noms de vue, mais aussi pour les indexeurs de données de visualisation.Quand je ne l'utilise vidéotex, vous verrez le code comme ceci dans ma page:

<%: ViewData[ViewDataConstants.Message] %> 

Si vous pouvez garder ces deux points de douleur en échec, et de garder l'utilisation à un niveau faible acceptable, vidéotex a ses avantages et devrait ne pas être négligé.

Questions connexes