【问题标题】:Breadcrumb with MVC Sitemap shows only one level带有 MVC Sitemap 的面包屑只显示一个级别
【发布时间】:2017-05-10 11:34:48
【问题描述】:

我需要在 Web 应用程序中使用 MVCSitemap 提供程序,但我无法在我有动态 url 的地方使用它。

我有一个类别列表,其中可以有父母和孩子。 例如,如果我点击一个类别,面包屑如下所示:

Home > Filter

如果我点击过滤器的一个孩子,我会得到:

Filter > Air filter

主页链接消失。 如果我点击我得到的“空气过滤器”的孩子:

Air filter > air filter children

等等。始终显示最后两个级别,如果我单击第一级,则始终返回主页。

这是在我的 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> 

这是来自 Product 控制器的 Subcategories 方法:

 [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;
        }

你能帮我吗,我在这里做错了什么? 我查看了网上所有的解释,尝试了很多方法,但都没有解决这个问题。

【问题讨论】:

    标签: asp.net-mvc mvcsitemapprovider


    【解决方案1】:

    这是我的示例。你可以参考一下。

    首先,我有一个站点地图:

     <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>
    

    【讨论】:

    • 感谢您的提示。这不是我想要的,但我会尝试在我的示例中使用它。
    猜你喜欢
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多