【问题标题】:MvcSiteMap generating a Menu without messing the breadcumbsMvcSiteMap 在不弄乱面包屑的情况下生成菜单
【发布时间】:2014-02-13 22:59:21
【问题描述】:

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

<li{{#class}} class="{{class}}" {{ />class}}>{{! print class name (active, open, etc) if   it exists }}
<a href="{{#link}}{{#createLinkFunction}}{{link}}{{/createLinkFunction}}{{/link}} {{^link}}#{{/link}}" {{#submenu?}} class="dropdown-toggle" {{ />submenu?}}>
{{#icon}}<i class="{{icon}}"></i>{{/icon}}
{{#level-1}}
<span class="menu-text">
{{/level-1}}

{{#level-2}}{{! if level-2 and no icon assigned, use this icon}}
{{^icon}}<i class="icon-double-angle-right"></i>{{/icon}}
{{/level-2}}

{{title}}
{{#badge}}
<span class="badge {{badge-class}} {{tooltip-class}}" {{#tooltip}} title="{{{tooltip}}}"  {{ />tooltip}}>{{{badge}}}
</span>
  {{/badge}}
  {{#label}}
<span class="label {{label-class}}" {{#label-title}} title="{{label-title}}" {{ />label-title}}>{{{label}}}</span>
  {{/label}}
{{#level-1}}
 </span>
{{/level-1}}

{{#submenu?}}<b class="arrow icon-angle-down"></b>{{/submenu?}}
</a>

{{#submenu?}}{{! if we have submenu items, print them recursively }}
<ul class="submenu">
{{#submenu}}
{{> layout.sidenav.items}}
{{/submenu}}
</ul>
{{/submenu?}}
</li>

因此,对于每个节点,这就是要应用的逻辑。我需要知道节点是否有子节点(子菜单),是 1 级还是 2 级节点。
1) 我怎么知道?
2)如果我需要更改我认为需要更改的 SiteMapNodeModel.cshtml,如何不弄乱面包屑,因为它们使用相同的模板?

【问题讨论】:

    标签: c# asp.net asp.net-mvc mvcsitemapprovider


    【解决方案1】:

    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
    
    <ul id="menu">
        @foreach (var node in Model.Nodes) { 
            <li>@Html.DisplayFor(m => node, "MyMenuNode") @* <-- // Custom Node Helper Name *@
                @if (node.Children.Any()) {
                    @Html.DisplayFor(m => node.Children, "MyMenuNodeList") @* <-- // Custom Node Helper Name *@
                }
            </li>
        }
    </ul>
    
    
    // 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
    
    <ul>
        @foreach (var node in Model) { 
            <li>@Html.DisplayFor(m => node, "MyMenuNode") @* <-- // Custom Node Helper Name *@
                @if (node.Children.Any()) {
                    @Html.DisplayFor(m => node.Children, "MyMenuNodeList") @* <-- // Custom Node Helper Name *@
                }
            </li>
        }
    </ul>
    
    
    
    // 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")  { 
        <text>@Model.Title</text>
    } else if (Model.IsClickable) { 
        if (string.IsNullOrEmpty(Model.Description))
        {
            <a href="@Model.Url">@Model.Title</a>
        }
        else
        {
            <a href="@Model.Url" title="@Model.Description">@Model.Title</a>
        }
    } else { 
        <text>@Model.Title</text>
    }
    

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

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

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

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

    【讨论】:

    • 其实@Html.MvcSiteMap().SiteMapPath()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多