MVC contrôles partiels
-
19-09-2019 - |
Question
Ok j'ai un système de menu avec un menu (dynamicly généré à partir d'un champ datavbase) Je veux inclure ce système de menu sur plusieurs vues - qui utilisent des contrôleurs differant et modèles.
<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>
Whast la meilleure façon d'y parvenir? Ai-je besoin de passer juste le modèle Catégories avec tous les autres modèles afin que je puisse faire le RenderPartial ( « Nom », modèle) Syntax?
La solution
Il existe deux façons d'y parvenir. Vous pouvez inclure les catégories dans tous les modèles ou vous pouvez stocker les catégories dans les 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 - je serais probablement aller avec ViewData et utiliser un contrôleur de base pour remplir il (probable OnActionExecuted) afin qu'il soit toujours disponible. À mon avis partiel je jetais l'élément ViewData à un objet fortement typé et de l'utiliser à partir de là.
La raison pour laquelle je le faire est de garder mes modèles propres à la vue réelle, qui n'a pas besoin de connaître les données pour le menu. Pour moi, cela semble être une exception raisonnable à l'itinéraire habituel 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>
Autres conseils
La 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 Ouputs juste le menu et laissez-le gérer est entreprise. Pas besoin de polluer ViewData.