2009-10-06 10 views
0

Ok J'ai un système de menu avec un menu (dynamiquement généré à partir d'un champ de base de données) Je veux inclure ce système de menu sur plusieurs vues - Toutes utilisent des contrôleurs et des modèles différents.Commandes partielles MVC

<ul> 
      <li><a href="#">All</a></li> 
       <% 
        foreach (var curCat in Model.CategoryList) 
        { 
       %> 
         <li><a href="/messagecentre/category/<%=curCat.CategoryID.ToString() %>"><%= Html.Encode(curCat.Category1)%></a></li>    
       <% 
        } 
       %> 
     </ul> 

Quel est le meilleur moyen d'y parvenir? Ai-je besoin de passer le modèle Catégories avec tous les autres modèles pour que je puisse faire le Synatx de RenderPartial ("Nom", Modèle)?

Répondre

0

Il y a deux manières différentes d'accomplir ceci. Vous pouvez inclure les catégories dans chaque modèle ou vous pouvez stocker les catégories dans ViewDataDictionary et les récupérer à partir de là. Normalement, je voudrais étendre le modèle avec des données afin que je puisse l'utiliser d'une manière fortement typée, mais dans ce cas - puisque les données sont omniprésentes - j'irais probablement avec ViewData et utiliserais un contrôleur de base pour peupler il (probablement dans OnActionExecuted) afin qu'il soit toujours disponible. Dans ma vue partielle, je transformerais l'élément ViewData en un objet fortement typé et l'utiliserais à partir de là.

La raison pour laquelle je ferais cela est de garder mes modèles propres pour la vue réelle, qui n'a pas besoin de connaître les données pour le menu. Pour moi, cela semble une exception raisonnable à la route habituelle de créer un modèle spécifique à la vue.

<% var categories = ViewData["categories"] as IEnumerable<Category>; %> 
<ul> 
    <li><a href="#">All</a></li> 
     <% 
    foreach (var curCat in categories) 
    { 
%> 
     <li><a href="/messagecentre/category/<%=curCat.CategoryID.ToString() %>"><%= Html.Encode(curCat.Category1)%></a></li>    
<% 
    } 
%> 
</ul> 
0

troisième voie - vérifier les contrats à terme MVC sur CodePlex, plus précisément la méthode de Html.RenderAction. Ensuite, vous pouvez créer un contrôleur qui ne fait que sortir du menu et le laisser gérer son activité. Pas besoin de polluer ViewData.

Questions connexes