2010-10-30 2 views
2

Une question à laquelle je n'ai pas encore trouvé de réponse est la suivante. Comment suivre les nœuds Sitemap actifs à plusieurs niveaux?MVC2 Navigation multiniveau

Par exemple:

  • noeud 1
  • noeud 2 "active"
    • noeud enfant 1
    • noeud enfant 2 "active"
  • noeud 3

Comment faire le suivi d'un childnode actif ainsi que du parent auquel il appartient d'être marqué comme actif. Je sais qu'il y a quelque chose appelé IsDescendant mais je reçois toujours des exceptions quand je l'utilise en raison de valeurs nulles.

Existe-t-il un screencast/tutoriel sur la navigation personnalisée plus avancée dans mvc.net (ou asp.net d'ailleurs). La plupart semblent traiter d'une simple navigation à un niveau.

Je préférerais des exemples en C# si possible, merci.

Répondre

1

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.

+0

Wow c'était utile. J'ai cherché et cherché et n'ai rien trouvé de vraiment utile sur ce sujet. Je vais essayer ça. –

Questions connexes