MvcSiteMap生成菜单而不会弄乱面包屑

我正在配置我的asp.net mvc 5应用程序以使用MvcSiteMap库。 所以,我可以成功配置面包车。
但是,菜单的模板比面包屑更复杂。 我有菜单的胡子版本(我没有显示ul标签):

  • class}}>{{! print class name (active, open, etc) if it exists }} submenu?}}> {{#icon}}{{/icon}} {{#level-1}} {{/level-1}} {{#level-2}}{{! if level-2 and no icon assigned, use this icon}} {{^icon}}{{/icon}} {{/level-2}} {{title}} {{#badge}} tooltip}}>{{{badge}}} {{/badge}} {{#label}} label-title}}>{{{label}}} {{/label}} {{#level-1}} {{/level-1}} {{#submenu?}}{{/submenu?}} {{#submenu?}}{{! if we have submenu items, print them recursively }} {{/submenu?}}
  • 因此,对于每个节点,这是要应用的逻辑。 我需要知道节点是否有子节点(子菜单),如果它是1级或2级节点。
    1)我怎么知道?
    2)如果我需要更改SiteMapNodeModel.cshtml,我认为我需要更改,如何不弄乱面包屑,因为他们使用相同的模板?

    MenuHelperModel一个模板并为其指定一个自定义名称,并将其放在/Views/Shared/DisplayTemplates/文件夹中。 然后,您可以为SiteMapNodeModelSiteMapNodeModelList创建一个模板,并为它们提供自定义名称。 将MenuHelperModel.cshtmlSiteMapNodeModel.cshtmlSiteMapNodeModelList.cshtml的内容复制到新的自定义帮助程序中。

    然后,更改模板中每个HTML帮助程序的覆盖,以便它们调用自定义模板而不是内置模板。

     // MyMenu.cshtml @* // This template is for the root level *@ @model MvcSiteMapProvider.Web.Html.Models.MenuHelperModel @using System.Web.Mvc.Html @using MvcSiteMapProvider.Web.Html.Models  // MyMenuNodeList.cshtml @* // This template is for the descendent lists below the root level *@ @model MvcSiteMapProvider.Web.Html.Models.SiteMapNodeModelList @using System.Web.Mvc.Html @using MvcSiteMapProvider.Web.Html.Models 
      @foreach (var node in Model) {
    • @Html.DisplayFor(m => node, "MyMenuNode") @* <-- // Custom Node Helper Name *@ @if (node.Children.Any()) { @Html.DisplayFor(m => node.Children, "MyMenuNodeList") @* <-- // Custom Node Helper Name *@ }
    • }
    // MyMenuNode.cshtml @* // This template is for the node *@ @model MvcSiteMapProvider.Web.Html.Models.SiteMapNodeModel @using System.Web.Mvc.Html @using MvcSiteMapProvider.Web.Html.Models Testing @* <-- // If configured right, Testing will appear before every node *@ @if (Model.IsCurrentNode && Model.SourceMetadata["HtmlHelper"].ToString() != "MvcSiteMapProvider.Web.Html.MenuHelper") { @Model.Title } else if (Model.IsClickable) { if (string.IsNullOrEmpty(Model.Description)) { @Model.Title } else { @Model.Title } } else { @Model.Title }

    然后从菜单中调用您的根模板。

     @Html.MvcSiteMap().Menu("MyMenu") 

    您可以将此作为起点,然后相应地对视图进行更改以输出所需的HTML。

    请注意, SiteMapNodeListHelper模板(在本例中为“ MySiteMapNodeList ”)以递归方式为每个连续级别的节点调用自身。