2014-02-13 85 views
1

我正在配置我的asp.net mvc 5應用程序以使用MvcSiteMap庫。所以,我可以成功配置breadcumbs。
但是,菜單的模板比麪包屑要複雜得多。我有菜單的小鬍子版本(我沒有顯示ul標籤):MvcSiteMap生成菜單,而不會弄亂麪包屑

<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,我認爲我需要改變,那麼如何不亂用breadcumbs,因爲它們使用相同的模板?

回答

2

製作MenuHelperModel的模板併爲其指定一個自定義名稱,並將其放入/Views/Shared/DisplayTemplates/文件夾中。然後,您可以爲SiteMapNodeModelSiteMapNodeModelList製作模板併爲其提供自定義名稱。將MenuHelperModel.cshtml,SiteMapNodeModel.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」)遞歸調用自身,以獲得每個連續的節點級別。

+0

其實'@ Html.MvcSiteMap()。SiteMapPath()' – Alex78191