加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 带有MVC Sitemap的Breadcrumb只显示一个级别

发布时间:2020-12-16 09:32:53 所属栏目:asp.Net 来源:网络整理
导读:我需要在Web应用程序中使用MVCSitemap提供程序,但我无法在有动态URL的地方使用它. 我有一个类别列表,可以有父母和孩子. 例如,如果我点击一个类别,面包屑看起来像这样: Home Filter 如果我点击过滤器的孩子,我得到: Filter Air filter 主页链接消失. 如果我
我需要在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 controller的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;
        }

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

解决方法

这是我的样本.你可以参考一下.

第一个,我有一个站点地图:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读