MvcSiteMapProvider - 多个页面需要链接到一个菜单节点

big*_*mac 7 asp.net-mvc mvcsitemapprovider

在我的MVC3项目中,我安装了Maartenba的MvcSiteMapProvider v.3.2.1,并且我创建了一个非常简单的静态两级菜单.下面是概念图结构.

- Home
- Member Center
    - Member Listing [SELECTED]
    - Event Calendar
    - Documents
- Administration
Run Code Online (Sandbox Code Playgroud)

现在,会员列表下有很多子页面(例如详细信息,编辑等),但我希望这些子页面显示为第3级菜单项(主要是因为它们与特定的成员ID绑定).但是,我确实希望所有这些第三级页面都与"成员列表"菜单节点"绑定",以便在这些页面上显示为已选中.

我的Mvc.SiteMap文件中有以下代码:

<mvcSiteMapNode title="Home" controller="Home" action="Index">
  <mvcSiteMapNode title="Member Center" area="Members" controller="Home" action="Index" roles="Approved Member" >
    <mvcSiteMapNode title="Member Listing" area="Members" controller="Member" action="List" />
    <mvcSiteMapNode title="Event Calendar" area="Members" controller="Event" action="List" />
    <mvcSiteMapNode title="Documents" area="Members" controller="Document" action="List" />
  </mvcSiteMapNode>
  <mvcSiteMapNode title="Administration" area="Admin" controller="Home" action="Index" roles="Site Administrator" >
  </mvcSiteMapNode>
</mvcSiteMapNode> 
Run Code Online (Sandbox Code Playgroud)

要呈现菜单,我在_Layout.cshtml文件中使用以下代码:

@Html.MvcSiteMap().Menu(1, true, true, 1, true, true)
Run Code Online (Sandbox Code Playgroud)

最后,我修改了SiteMapNodeModel.cshtml文件,以便将"selectedMenuItem"类添加到与用户正在查看的页面相关的节点.这是呈现菜单节点的snippit.

@model SiteMapNodeModel
  <a href="@Model.Url" class="@(Model.IsCurrentNode ? "selectedMenuItem" : "")">@Model.Title</a>
Run Code Online (Sandbox Code Playgroud)

地图的显示和导航工作得很好,直到我进一步导航到成员区域.例如,如果我经过Members/Member/List(正确显示菜单)和页面Members/Member/Detail/1,会员中心下的子节点("会员列表","活动日历"等)将消失.因此,以下是我对当前代码的两个问题:

  1. 我想指定任何给定页面是"成员中心"父菜单节点的一部分,这样无论给定页面是否被定义为菜单中的特定节点,都将显示"成员中心"的子菜单节点结构体.

  2. 我想指定(可能在视图或控制器操作中)特定页面应绑定到特定菜单节点.例如,当用户在Members/Member/Detail/1,我只需要指定"Member Listing"子节点,IsCurrentNode以便SiteMapNodeModel.cshtml文件使用"selectedMenuItem"类正确地装饰它.

有什么建议?

Max*_*lev 6

您可以将第3级节点添加到站点地图XML,并指定可见性以从菜单中隐藏它们.以下是仅在面包屑中显示它的节点声明:

<mvcSiteMapNode area="Members"
                controller="Member"
                action="Detail"
                visibility="SiteMapPathHelper,!*"
                title="Member details" />
Run Code Online (Sandbox Code Playgroud)

编辑:

据我所知,你不能设置IsCurrentNode.但您可以使用以下代码检查当前是否选择了菜单节点(我在SiteMapNodeModel显示模板中使用它):

IList<string> classes = new List<string> ();
if (Model.IsCurrentNode || Model.IsInCurrentPath && !Model.Children.Any ())
{
    classes.Add ("menu-current");
}
Run Code Online (Sandbox Code Playgroud)