2016-02-11 2 views
1

Je tente de créer un menu dynamique dans mon contrôleur que je rends ensuite à ma vue. Ce que je trouve est que Controls.Add enlève des articles de ma liste et je finis seulement l'affichage de l'article final. Comment puis-je m'assurer qu'il affiche tous les éléments de ma liste et comment puis-je finir d'afficher les éléments enfants depuis que je crée un menu dynamique?Commandes.Ajouter supprimer les éléments précédents de la liste

public string CreateDynamicMenu() 
     { 
      HtmlGenericControl navbar = new HtmlGenericControl("nav"); 
      navbar.Attributes.Add("class", "navbar navbar-default"); 
      HtmlGenericControl containerDiv = new HtmlGenericControl("div"); 
      containerDiv.Attributes.Add("class", "container-fluid"); 
      HtmlGenericControl collapseDiv = new HtmlGenericControl("div"); 
      collapseDiv.Attributes.Add("class", "collapse navbar-collapse"); 
      HtmlGenericControl navUl = new HtmlGenericControl("ul"); 
      navUl.Attributes.Add("class", "nav navbar-nav"); 
      HtmlGenericControl dropdownLi = new HtmlGenericControl("li"); 
      dropdownLi.Attributes.Add("class", "dropdown"); 
      HtmlGenericControl mainMenuA = new HtmlGenericControl("a"); 


      var myMenu = menuListForUserG.GetMenus(Global.CurrentProfile.UserID).OrderBy(x => x.MenuOrder).ThenBy(y => y.MenuName); 
      var navbarmenu = myMenu.Where(x => x.ParentID == null); 

      foreach (var item in navbarmenu) 
      {  
       mainMenuA.InnerText = item.MenuName; 
       dropdownLi.Controls.Add(mainMenuA); 
       navUl.Controls.Add(dropdownLi);      
      } 

      collapseDiv.Controls.Add(navUl); 
      containerDiv.Controls.Add(collapseDiv); 
      navbar.Controls.Add(containerDiv);  

      StringBuilder htmlStringBuilder = new StringBuilder(); 
      HtmlTextWriter htmlStringWriter = new HtmlTextWriter(new StringWriter(htmlStringBuilder)); 
      navbar.RenderControl(htmlStringWriter); 
      String output = htmlStringBuilder.ToString(); 
      return output; } 

Répondre

2

Le problème est que vous ajoutez la même instance de dropdownLi et mainMenuA dans la boucle et encore. Je suppose que Control.Add n'ajoutera pas de doublons dans la liste, donc le contrôle n'est effectivement ajouté qu'une seule fois. Avec le dernier tour de la boucle, vous changez le texte pour le texte du dernier élément.

Pour résoudre ce problème, vous devez créer de nouvelles instances comme suit:

foreach (var item in navbarmenu) 
{ 
    // Move the following lines from outside the loop inside 
    HtmlGenericControl dropdownLi = new HtmlGenericControl("li"); 
    dropdownLi.Attributes.Add("class", "dropdown"); 
    HtmlGenericControl mainMenuA = new HtmlGenericControl("a");  
    mainMenuA.InnerText = item.MenuName; 
    dropdownLi.Controls.Add(mainMenuA); 
    navUl.Controls.Add(dropdownLi);      
} 
+1

homme merci. ça a marché. – Nakres