2010-10-27 17 views
7

Donc s'il y a un état global que chaque vue d'une application MVC devra rendre ... par exemple: IsUserLoggedOn et UserName ... quel est le moyen approprié d'obtenir cette information pour chaque vue?ASP.NET MVC: comment gérer les données de modèle qui doivent être affichées dans chaque vue?

Je comprends que cette partie de la vue doit être dans la page maître ou dans une vue partielle ajoutée aux autres vues. Mais quel est le meilleur moyen de s'assurer que les données du modèle 'global' sont transmises à la vue à chaque fois par tous les contrôleurs et actions concernés?

Répondre

6

Après avoir demandé, je trouve ce bon blog par Steve Sanderson : http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/

Il suggère trois différents approches:

  • utiliser pour ajouter le modèle correspondant à la collecte ViewData[] chaque fois une classe de contrôleur de base ou ActionFilter. Je pense que quelques personnes ont déjà suggéré ce genre de chose.

  • Utilisez Html.RenderAction() dans la vue ... et comme il le dit:

Si quelqu'un vous dit que internes sont mauvais parce que les sous-requêtes il «n'est pas MVC », puis juste mordre les sur le visage immédiatement. Demandez-leur également pourquoi ils sont toujours prêts à utiliser Ajax, et même <IMG> tags d'ailleurs, étant donné que les deux sont une forme de sous-demande .

  • utilisation « Demande partielle » (il fournit le code pour cela sur his blog) qui permettent à un contrôleur de nid appelle à d'autres contrôleurs dans une structure imbriquée. ViewData sortof
+0

+1 RenderAction est le chemin à suivre. Maintient la belle SRP – redsquare

3

codeulike - voir la réponse à une question similaire posée exactement en même temps que celle-ci:

ASP.NET MVC displaying user name from a Profile

en un mot, créer essentiellement un contrôleur de base qui est héritée par tous vos autres contrôleurs. le contrôleur de base a alors une fonction prioritaire qui transporte thro 'à tous les contrôleurs' enfants '. plutôt que de dupliquer le code, jetez un oeil à ma réponse ci-dessus et essayer ..

acclamations ...

2

Vous pouvez créer la classe de base pour viewmodel qui contient des informations partagées et hériteront que pour chaque viewmodel.

public class ViewModelBase 
{ 
    // shared data 
} 
public class Page1ViewModel : ViewModelBase 
{ 
    // page 1 data 
} 

En masterpage vous pouvez utiliser cette classe de base

Inherits="System.Web.Mvc.ViewMasterPage<ViewModelBase>" 

et dans chaque vue d'utiliser ces classes dérivées

Inherits="System.Web.Mvc.ViewPage<Page1ViewModel>" 
+0

À droite, mais comment remplir ce modèle à chaque fois? Vraisemblablement avec un contrôleur de base, non? – codeulike

+0

Constructeur ViewModelBase/classe d'assistance/classe de base du contrôleur –