MVCSitemapProvider指示当前节点和父节点

Rem*_*emy 6 c# asp.net-mvc mvcsitemapprovider asp.net-mvc-sitemap

我想用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>
Run Code Online (Sandbox Code Playgroud)

为了标记父节点,我构建了一个扩展方法来检查所有直接子元素(我只有2个级别):

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

        return node.Children.Any(n => n.IsCurrentNode);
    }
Run Code Online (Sandbox Code Playgroud)

并改变了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>
Run Code Online (Sandbox Code Playgroud)

这现在完美无缺.但是真的没有更简单的方法吗?难道不能成为世界上第一个需要这个的人吗?

The*_*ørg 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>  
}
Run Code Online (Sandbox Code Playgroud)

并将其插入

_Layout.cshtml

@Html.MvcSiteMap().Menu("MainMenu")
Run Code Online (Sandbox Code Playgroud)

基本上它做同样的事情,只是一点点清洁(在我看来)


Nig*_*888 4

您很可能是地球上第一个需要这个的人。话又说回来,我怀疑有许多有用方法的库可以使 MvcSiteMapProvider 更有用。

MvcSiteMapProvider 是一项开源协作成果。如果您发现这样的东西可能对很多人有用,我们将不胜感激通过拉取请求 @ GitHub 在 dev 分支上做出贡献。这个想法将做出非常好的贡献。我建议直接将该方法添加到 SiteMapNodeModel 对象中。