Ok ,,, j'ai souffert de la même question et je suis venu avec un travail autour, vérifier ma réponse à cette question:
Hierarchical menu in view based on parent child class
Je voulais venir avec une manière plus générique et élégante de le faire puisque j'ai fait face au problème mais j'ai été occupé depuis. J'espère que je vais trouver un peu de temps dans les prochaines semaines pour trouver quelque chose ,,,
Remarque: la simplicité dans ma solution dans la question ci-dessus dans les méthodes DisplayMenu
et ConvertToItem
particularité, J'ai enlevé les parties où il devrait vérifier les champs currentMenuID
et currentMenuItemID
et ajouter la classe css current
à l'élément li (ou la classe active
dans votre cas).
Puisque c'est la question de votre question, j'ai fourni les méthodes complètes ci-dessous.
public static string DisplayMenu(this HtmlHelper helper, NavigationModel navigationMenu)
{
string classOfCurrentMenu;
String result = "<ul id='main-nav'>\n";
foreach(Menu menu in navigationMenu.Menus)
{
classOfCurrentMenu = "";
if (menu.ID == navigationMenu.currentMenuID)
{
classOfCurrentMenu = "current";
}
result += "<li>\n";
result += string.Format("<a href='#' class='{0}'> {1} </a>\n", helper.AttributeEncode(classOfCurrentMenu),helper.AttributeEncode(menu.Name));
result += "<ul>\n";
foreach(MenuItem item in menu.MenuItems)
{
result += NavigationHelper.ConvertToItem(helper, item, navigationMenu.currentMenuID, navigationMenu.currentMenuItemID);
}
result += "</ul>\n";
result += "</li>\n";
}
result += "</ul>\n";
return result;
}
private static string ConvertToItem(this HtmlHelper helper,MenuItem item, int currentMenuID, int currentMenuItemID)
{
if (item.Show)
{
string classOfCurrentItem = "";
if (item.ID == currentMenuItemID && item.MenuID == currentMenuID)
classOfCurrentItem = "current";
return string.Format("<li><a href='{0}' class='{1}'>{2}</a></li>\n", helper.AttributeEncode(item.Link), helper.AttributeEncode(classOfCurrentItem), helper.AttributeEncode(item.Label));
}
else { return ""; }
}
Je ne considère pas cela comme une solution parfaite au problème, je déteste écrire HTML dans le code C#, je vais essayer de mon mieux pour arriver à un (plusieurs niveaux) plus générique solution plus propre pour le problème , et bien sûr faire usage de la classe TagBuilder
dans le cadre.
Wow c'était utile. J'ai cherché et cherché et n'ai rien trouvé de vraiment utile sur ce sujet. Je vais essayer ça. –