2017-05-10 1 views
4

Je dois utiliser le fournisseur MVCSitemap dans une application Web, mais je ne peux pas le faire fonctionner là où j'ai des URLs dynamiques.Fil d'Ariane avec MVC Le plan Sitemap montre un seul niveau

J'ai une liste de catégories, qui peuvent avoir des parents et des enfants. Par exemple, si je clique sur une catégorie, le fil d'Ariane ressemble à ceci:

Home > Filter 

si je clique sur un enfant du filtre, je suis arrivé:

Filter > Air filter 

le lien Accueil disparait. Si je clique sur les enfants du « filtre à air » Je suis arrivé:

Air filter > air filter children 

et ainsi de suite. Toujours les deux derniers niveaux sont affichés, et si je clique sur le premier niveau, retourne toujours à la page d'accueil.

Ceci est mon MvcSitemap:

<mvcSiteMapNode title="Home" controller="Home" action="Index"> 
<mvcSiteMapNode title="Product" controller="Product" action="SubCategories" preservedRouteParameters="selected,category,id,engineId"> 
    <mvcSiteMapNode title="Details" controller="Product" action="ProductDetails" preservedRouteParameters="supplierName,code,name,prodId,-1"/> 
    </mvcSiteMapNode> 

    </mvcSiteMapNode> 

Ceci est la méthode sous-catégories de contrôleur de produit:

[MvcSiteMapNode(Title = "Article", ParentKey = "SubCategories")] 
[Route("{selected}-{category}-{id}-{engineId}")] 
public ActionResult SubCategories(string selected, string category, int id, string engineId) 
    { 
     ........................... 
     SiteMaps.Current.CurrentNode.Title = categoryName; 
     if(categoryRepository.GetCategoryByID(id).ParentId.HasValue) 
     { 
      int parentId = categoryRepository.GetCategoryByID(id).ParentId.Value; 
      string parentName = categoryRepository.GetCategoryByID(parentId).Name; 
      SiteMaps.Current.CurrentNode.ParentNode.RouteValues["id"] = id; 
      SiteMaps.Current.CurrentNode.ParentNode.Title = parentName; 
     } 

Pouvez-vous s'il vous plaît aidez-moi, ce que je fais mal ici? J'ai vérifié toutes les explications sur le web, j'ai essayé de plusieurs façons, mais aucune d'entre elles n'a résolu ce problème.

Répondre

0

Voici mon exemple. Vous pouvez le référer.

La première, je le sitemap:

<mvcSiteMapNode title="Home" controller="Home" action="Index"> 
     <mvcSiteMapNode title="About" controller="Home" action="About" /> 
     <mvcSiteMapNode title="Contact" controller="Home" action="Contact" /> 
     <mvcSiteMapNode title="Administration" clickable="false"> 
      <mvcSiteMapNode title="User Mgmt" controller="Administration" action="UserMgmt" clickable="false" > 
      <mvcSiteMapNode title="List Role" controller="Administration" action="ListRole" > 
       <mvcSiteMapNode title="Details" controller="Administration" action="Details"> 
       <mvcSiteMapNode title="XXX" controller="Administration" action="XXX" /> 
       </mvcSiteMapNode> 
      </mvcSiteMapNode> 
      </mvcSiteMapNode> 
      <mvcSiteMapNode title="Role Mgmt" controller="Home" action="RoleMgmt" />  
     </mvcSiteMapNode>  
     </mvcSiteMapNode> 

//And then, I create a BootstrapMenuHelperModel view that load this sitemap. //I putted it at DisplayTemplates. 

@model MvcSiteMapProvider.Web.Html.Models.MenuHelperModel 
@using MvcSiteMapProvider.Web.Html.Models 

@helper TopMenu(List<SiteMapNodeModel> nodeList) 
{ 
    <nav class="navbar navbar-default" role="navigation"> 
     <div class="container-fluid"> 
      <div class="collapse navbar-collapse"> 
       <ul class="nav navbar-nav"> 
        @foreach (SiteMapNodeModel node in nodeList) 
        { 
         string url = node.IsClickable ? node.Url : "#"; 

         if (!node.Children.Any()) 
         { 
          <li><a href="@url">@node.Title</a></li> 
         } 
         else 
         { 
          <li class="dropdown"> 
           <a class="dropdown-toggle" data-toggle="dropdown">@node.Title <span class="caret"></span></a> 
           @DropDownMenu(node.Children) 
          </li> 
         } 

         if (node != nodeList.Last()) 
         { 
          <li class="divider-vertical"></li> 
         } 
        } 
       </ul> 
      </div> 
     </div> 
    </nav> 
} 

@helper DropDownMenu(SiteMapNodeModelList nodeList) 
{ 
    <ul class="dropdown-menu" role="menu"> 
     @foreach (SiteMapNodeModel node in nodeList) 
     { 
      if (node.Title == "Separator") 
      { 
       <li class="divider"></li> 
       continue; 
      } 

      string url = node.IsClickable ? node.Url : "#"; 

      if (!node.Children.Any()) 
      { 
       <li><a href="@url">@node.Title</a></li> 
      } 
      else 
      { 
       <li class="dropdown-submenu"><a href="@url">@node.Title</a>@DropDownMenu(node.Children)</li> 
      } 
     } 
    </ul> 
} 

@TopMenu(Model.Nodes) 

//Finally, call this view from layout 
<div class="row"> 
      <div class="span12"> 
       <nav> 
        @Html.MvcSiteMap().Menu("BootstrapMenuHelperModel") 
       </nav> 
      </div> 
     </div> 
+0

Merci pour le conseil. Ce n'est pas exactement ce que je cherchais, mais je vais essayer de l'utiliser dans mon exemple. – Orsi