Je suis assez nouveau pour ASP.Net et MVC.Aide ASP.Net MVC avec refactoring
J'ai obtenu le code suivant dans ma page principale:
<div id="main-menu" class="menu">
<%
var items = (IList<CompanyName.Framework.Web.MenuItem>)ViewData["MainMenu"];
if (items.Count > 0)
{
%><ul><%
foreach (var item in items)
{
if (!string.IsNullOrEmpty(item.RequiredRole) && !System.Threading.Thread.CurrentPrincipal.IsInRole(item.RequiredRole))
continue;
%><li><a href="<%= item.Uri %>"><%= item.Title %></a></li><%
}
%></ul><%
}
%>
</div>
Puis-je déplacer le code à un autre fichier ou factoriser le code de quelque façon?
modifier:
Mon ApplicationController que tous les contrôleurs dérivent:
public class ApplicationController : Controller
{
List<MenuItem> _mainMenu = new List<MenuItem>();
List<MenuItem> _contextMenu = new List<MenuItem>();
protected IList<MenuItem> MainMenu
{
get { return _mainMenu; }
}
protected IList<MenuItem> ContextMenu
{
get { return _contextMenu; }
}
protected string PageTitle { get; set; }
protected override void OnResultExecuting(ResultExecutingContext filterContext)
{
ViewData["PageTitle"] = PageTitle;
ViewData["MainMenu"] = MainMenu;
ViewData["ContextMenu"] = ContextMenu;
base.OnResultExecuting(filterContext);
}
}
+1 belle amélioration flux !! –
Le problème est que j'utilise mes BusinessObjects comme modèles pour la plupart des vues. Le MainMenu (et un ContextMenu) sont des propriétés sur ApplicationControlLer et sont affectés à ViewData avant l'exécution de ActionResult. Bien sûr, je pourrais faire un ApplicationViewData qui prend l'objet métier comme argument de type. Mais cela ne semble pas une solution propre comme les propriétés dans le contrôleur et l'utilisation de ViewData ["MainMenu"] dans la page maître, puisque seule la page maître est affectée par ce dernier. J'aime votre solution, mais comment puis-je l'utiliser sans avoir à utiliser des vues typées? –
jgauffin
S'il se trouve dans la page maître, cela signifie que toutes les vues ont besoin de cette propriété. Vous pouvez donc faire en sorte que tous vos modèles de vue dérivent d'un modèle de vue de base qui contient le menu en tant que propriété. Cette propriété peut ensuite être remplie dans un filtre d'action pour éviter de le faire dans toutes les actions, puis la page maître peut être fortement typée sur ce modèle de vue de base. –