2013-11-22 3 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 - совместная работа с открытым исходным кодом. Если вы заметите что-то подобное, что может быть полезно для большого количества людей, мы бы оценили making a contribution по запросу pull @GitHub on the dev branch. Эта идея внесет очень хороший вклад. Я предлагаю добавить метод непосредственно к объекту 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

Это отличная публикация!

пока я не согласен с комментарием другого плаката, на этой странице было то, что я искал. Мой клиент терялся в больших меню с подменю подменю ... пока я не поклонник этого, это то, чего они хотели.

Я хотел бы улучшить то, что предложил Теодор. вместо использования 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) 
Смежные вопросы