none
Menu dans une application MVC 2 en C# RRS feed

  • Question

  • Bonjour à tous,

     

    J'ai un soucis de menu dans mon application MVC 2 en C#.

     

    J'essaye de réaliser un menu en deux niveaux, le premier niveau avec des onglets fixes et le second niveau de sous onglets différents en fonction de l'onglet choisi dans le premier niveau.

    Le premier niveau doit apparaître d'une couleur différente lorsqu'on a cliqué sur celui-ci et pareil pour le second niveau.

     

    Pour ce faire j'utilise deux choses : 

    - Une classe RoutingSiteMapProvider.cs que j'ai trouvé dans le bouquin "ASP.NET MVC2 Framework" de Steven Sanderson, qui me permet de Créer mon SiteMap. Cette partie fonctionne bien.

    - Une extension du HtmlHelpers qui va me générer un menu à partir de mon SiteMap :

     

      public static void RenderNavMenu(this HtmlHelper html)
      {
       HtmlTextWriter writer = new HtmlTextWriter(html.ViewContext.Writer);
       StaticSiteMapProvider ssmp = new RoutingSiteMapProvider();
       RenderRecursive(writer, SiteMap.RootNode);
      }
    
      private static void RenderRecursive(HtmlTextWriter writer, SiteMapNode node)
      {
       if (SiteMap.CurrentNode == node)
       {
        writer.RenderBeginTag(HtmlTextWriterTag.B);
       }
       else
       {
        writer.AddAttribute(HtmlTextWriterAttribute.Href, node.Url);
        writer.RenderBeginTag(HtmlTextWriterTag.A);
       }
       writer.Write(node.Title);
       writer.RenderEndTag();
    
       // Render children
       if (node.ChildNodes.Count > 0)
       {
        writer.RenderBeginTag(HtmlTextWriterTag.Ul);
        foreach (SiteMapNode child in node.ChildNodes)
        {
         writer.RenderBeginTag(HtmlTextWriterTag.Li);
         RenderRecursive(writer, child);
         writer.RenderEndTag();
        }
        writer.RenderEndTag();
       }
      }
    

     

     

    Dans mon global.asax j'ai cette route :

     

       routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
       );
    

     

    Imaginons un onglet du menu qui pointe vers /Home/Index. Si on tappe /Home/Index dans la barre d'adresse du navigateur tout va bien le texte de l'onglet se change et passe en gras pour indiquer qu'on se trouve sur sa page. 

    Par contre, si on tape /Home/ ou /Home/Index/ ou /Home/Index?id=2 il ne s'y retrouve plus. Alors que la page affichée est toujours celle dont le lien pointe.

     

    Ce n'est pas évident à expliquer, j’espère que je ne vous ai pas perdu en cours de route, j'ai essayé plusieurs solution dont celle de parser l'url du navigateur pour la comparer à celle liée au menu, mais en vain.

     

    Est-ce que certains d'entre vous ont réussi à créer un menu qui se modifie bien malgré une URL qui peut être différente (mais qui pointe toujours vers la même vue) ? 

     

    Merci à tous.

    vendredi 14 janvier 2011 14:01

Réponses

  • J'ai trouvé ! :)

     

    Pour ceux qui cherchent à faire un menu en MVC il faut utiliser Html.ViewContext.RequestContext.RouteData pour savoir quelle route est demandée.

     

    Vous pourrez alors avoir votre controller et votre action et les comparer avec ceux de votre menu.

    • Marqué comme réponse YouggyDew mardi 18 janvier 2011 09:25
    mardi 18 janvier 2011 09:25