2013-11-22 65 views
6

我想標記當前節點,它是父類的一個css類。我在尋找了一圈,發現這些鏈接:MVCSitemapProvider指示當前節點和父節點

http://mvcsitemap.codeplex.com/discussions/257786 http://mvcsitemap.codeplex.com/discussions/245000

所以我修改SiteMapNodeModelList.cshtml現在,當前節點正在凸顯。但不知道如何突出顯示父節點。

<ul> 
    @foreach (var node in Model) { 
     <li class="@(node.IsCurrentNode ? "current" : "")" >@Html.DisplayFor(m => node) 
      @if (node.Children.Any()) { 
       @Html.DisplayFor(m => node.Children) 
      } 
     </li> 
    } 
</ul> 

爲了紀念我建立的一個檢查所有直接子元素的擴展方法父節點(我只有2級):

public static bool IsCurrentNodeOrChild(this SiteMapNodeModel node) 
    { 
     if (node.IsCurrentNode) return true; 

     return node.Children.Any(n => n.IsCurrentNode); 
    } 

而改變MenuHelperModel.cshtml這樣的:

<ul id="menu"> 
    @foreach (var node in Model.Nodes) { 
     <li class="@(node.IsCurrentNodeOrChild() ? "current" : "d")" >@Html.DisplayFor(m => node) 
      @if (node.Children.Any()) { 
       @Html.DisplayFor(m => node.Children) 
      } 
     </li> 
    } 
</ul> 

這現在完美。但是真的沒有簡單的方法嗎?不能成爲地球上第一個需要這個的人嗎?

回答

3

你很可能是地球上第一個需要它的人。然後再次,我懷疑有幾十個有用的方法庫可以使MvcSiteMapProvider更有用。

MvcSiteMapProvider是一個開源協作工作。如果你發現這樣的東西可能對很多人有用,請通過pull request @GitHub on the dev branch來欣賞making a contribution。這個想法會做出非常好的貢獻。我建議直接將該方法添加到SiteMapNodeModel對象。

+1

謝謝!這不是針對MvcSiteMapProvider的。我越來越覺得我在某個地方失去了某種東西。 – Remy

+1

我創建了一個git pull。 https://github.com/maartenba/MvcSiteMapProvider/pull/251 我希望我已經做到了這一點。 – Remy

+0

對不起,爲了讓它恢復原狀,但有沒有可能通過自定義標籤擴展SiteMapNodeModel(例如,用於過濾節點)?我想使用node.ResourceKey,但節點無法訪問。 – Storm

5

也就是說真的很酷,但是當我不斷創造這樣那樣的擴展,我採取了不同的做法,但我要指出,這是根據你的想法:d

MainMenu.cshtml:

@model MvcSiteMapProvider.Web.Html.Models.MenuHelperModel 
@using MvcSiteMapProvider.Web.Html.Models 

@foreach (var node in Model.Nodes) 
{ 
    <li @((node.IsCurrentNode || node.Children.Any(n => n.IsCurrentNode)) ? "class=active" : "")>@Html.DisplayFor(m => node)</li> 
} 

,並插入到這個

_Layout.cshtml

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

基本上它做同樣的事情,只是一點點清潔(在我看來)

0

這是一個偉大的發佈!

雖然我不同意來自另一張海報的評論,但這個頁面正是我所期待的。我的顧客正在用子菜單的子菜單在大菜單中迷路......雖然我不是它的粉絲,但這正是他們想要的。

我想改進Theodor的建議。而不是使用node.Children,請使用node.Descendants。這樣,如果你在第二個子列表中,它仍然顯示在頂部!

@model MvcSiteMapProvider.Web.Html.Models.MenuHelperModel 
@using System.Web.Mvc.Html 
@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 class="@((node.IsCurrentNode || node.Descendants.Any(n => n.IsCurrentNode)) ? "active" : "")"><a href="@url">@node.Title</a></li> 
         } 
         else 
         { 
          <li class="dropdown @((node.IsCurrentNode || node.Descendants.Any(n => n.IsCurrentNode)) ? "active" : "")"><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 class="@((node.IsCurrentNode || node.Descendants.Any(n => n.IsCurrentNode)) ? "active" : "d")"><a href="@url">@node.Title</a></li> 
      } 
      else 
      { 
       <li class="dropdown-submenu @((node.IsCurrentNode || node.Descendants.Any(n => n.IsCurrentNode)) ? "active" : "d")"><a href="@url">@node.Title</a>@DropDownMenu(node.Children)</li> 
      } 
     } 
    </ul> 
} 

@TopMenu(Model.Nodes) 
相關問題