2010-06-24 15 views
5

Quelqu'un peut-il expliquer pourquoi vous définissez ViewData ["MenuData"] sur chaque action pour quelque chose comme un menu dynamique?ASP.NET MVC, vues partielles et données

J'ai une vue partielle simple qui rend un menu, je rend ce menu à partir d'une page maître. C'est intuitif pour moi venant de ASP.NET WebForms, mais la seule façon pour moi de remplir le menu est de passer ViewData ["MenuData"], mais je dois le faire dans chaque action du contrôleur. Cela me semble un peu stupide, que je devrais définir cette vue à chaque fois.

En termes de testabilité et quel est ASP.NET MVC-ish comment dois-je aborder cela?

Répondre

4

Une autre option consiste à utiliser la méthode RenderAction au lieu qui sera appelez une action (soit sur le contrôleur actuel, ou si vous fournissez un nom de contrôleur, ce contrôleur), qui peut alors construire les données de menu pour vous, et appelez votre vue ascx partielle:

Donc sur mon maître Je peux avoir:

<% Html.RenderAction("MenuArchiveList"); %> 

Puis, dans mon contrôleur:

public ActionResult MenuArchiveList() { 
    return PartialView("BlogArchiveList", 
        _BlogRepository.GetArchiveYearPostCounts()); 
} 

Ce puis trouve avec succès le contrôle de l'utilisateur \Views\Shared\BlogArchiveList.ascx

Si vous voulez vous assurer que votre action est jamais appelée dans le contexte d'une vue partielle , alors vous devriez le décorer avec le ChildActionOnlyAttribute.

Cela a été ajouté dans System.Web.Mvc dans la version 2 à partir de l'espace de noms "futures" Microsoft.Web.Mvc.

+0

C'est le truc. Je vous remercie. –

+0

Pas de problème, c'est un plaisir. –

0

Vous devez utiliser un contrôleur de base qui gère la population répétée de votre modèle de vue et d'avoir tous vos contrôleurs en dérivent

voir ici ViewModel Best Practices