我想用css类标记当前节点及其父节点。我在四处寻找并找到了这些链接:
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>
这现在完美无缺。但是真的没有更简单的方法吗?难道不能成为地球上第一个需要这个的人吗?
答案 0 :(得分: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")
基本上它做同样的事情,只是一点点清洁(在我看来)
答案 1 :(得分:3)
你很可能是地球上第一个需要这个的人。然后,我怀疑有很多有用的方法库可以使MvcSiteMapProvider更有用。
MvcSiteMapProvider是一项开源协作工作。如果你发现这样的东西可能对很多人有用,我们会感谢making a contribution拉取请求@ GitHub on the dev branch。这个想法会做出很好的贡献。我建议直接将该方法添加到SiteMapNodeModel对象。
答案 2 :(得分: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)