Asp.net mvc 4 使用MvcSiteMapProvider显示部分节点级别

Asp.net mvc 4 使用MvcSiteMapProvider显示部分节点级别,asp.net-mvc-4,razor,mvcsitemapprovider,Asp.net Mvc 4,Razor,Mvcsitemapprovider,我正在使用MVC4的MvcSiteMapProvider(v4.6.1)来处理面包屑和菜单。我已经阅读了关于安装、配置和使用@Html.MvcSiteMap().Menu()的100级教程 我现在想要一个菜单,显示顶级的一部分。目前,我的顶级节点包括Home、Profile、Login、thing1、thing2和thing3。接着,我制作了一个菜单,在水平行中显示所有这些项目。我还确定,一旦系统包含授权,无法访问Thing3的用户将无法在其菜单上看到授权 不过,我想要的是只显示一些项目:主页和

我正在使用MVC4的MvcSiteMapProvider(v4.6.1)来处理面包屑和菜单。我已经阅读了关于安装、配置和使用
@Html.MvcSiteMap().Menu()
的100级教程

我现在想要一个菜单,显示顶级的一部分。目前,我的顶级节点包括Home、Profile、Login、thing1、thing2和thing3。接着,我制作了一个菜单,在水平行中显示所有这些项目。我还确定,一旦系统包含授权,无法访问Thing3的用户将无法在其菜单上看到授权

不过,我想要的是只显示一些项目:主页和登录必须显示在面包屑中,但不能显示在菜单中。请注意,它们在当前站点地图中不是连续的

你们都有什么建议

我目前的观点,摘自链接的答案:

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

<div class="nav navbar-nav navbar-left">
    <ul class="nav navbar-nav">
        @foreach (var node in Model.Nodes) { 
            <li>@Html.DisplayFor(m => node)</li>
        }
    </ul>
</div>
当然,我可以制作一个新的菜单助手来过滤掉我不想显示的菜单

编辑:Mvc.sitemap:

  <mvcSiteMapNode title="Home" controller="Home" action="Index" visibility="MainMenu,!*">
    <mvcSiteMapNode title="About" controller="Home" action="About"/>
    <mvcSiteMapNode title="Profile" controller="Home" action="UpdateProfile" visibility="MainMenu,!*"/>
    <mvcSiteMapNode title="Login" controller="SGAccount" action="Login">
      <mvcSiteMapNode title="Register" controller="SGAccount" action="Register">  
      </mvcSiteMapNode>
    </mvcSiteMapNode>
    <mvcSiteMapNode title="Thing1" controller="Thing1" action="Index" visibility="MainMenu,!*">
      <mvcSiteMapNode title="Thing1-action1" controller="Thing1" action="action1" visibility="RoleMenu,!*"/>
      <mvcSiteMapNode title="Thing1-action2" controller="Thing1" action="action2" visibility="RoleMenu,!*"/>
    </mvcSiteMapNode>
    <mvcSiteMapNode title="Thing2" controller="Thing2" action="Index" visibility="MainMenu,!*">
    </mvcSiteMapNode>
  </mvcSiteMapNode>

主菜单显示Home、About、Profile、Login、Thing1和Thing2。它不应该显示所有这些

编辑2:使用外部DI的结构图,我添加了这一行,但我不确定它是否正确:

x.For<ISiteMapNodeVisibilityProviderStrategy>().Use<SiteMapNodeVisibilityProviderStrategy>();
x.For().Use();
编辑3:我的面包屑,
@Html.MvcSiteMap().SiteMapPath()
,停止工作。这也需要修正


编辑4:通过从
web.config
中删除内部DI设置,我修复了前两次编辑的问题。现在,我又开始展示我想要展示的内容。

实现这一点的最佳方法是使用IsItemaNodeVisibilityProvider。该框中有一个FilteredItemsNodeVisibilityProvider,可通过为每个菜单指定名称,用于仅在某些菜单实例上显示节点

1) 将VisibilityAffectsDescents设置为false,将默认可见性提供程序设置为FilteredItemsNodeVisibilityProvider

<appSettings>
    <add key="MvcSiteMapProvider_VisibilityAffectsDescendants" value="false"/>
    <add key="MvcSiteMapProvider_DefaultSiteMapNodeVisibiltyProvider" value="MvcSiteMapProvider.FilteredSiteMapNodeVisibilityProvider, MvcSiteMapProvider"/>
</appSettings>
3) 如前所述,设置每个节点的可见性属性。请记住,您还可以按HTML帮助器类型进行筛选

<mvcSiteMapNode title="Home" controller="Home" action="Index" visibility="TopMenu,BottomMenu,SiteMapPathHelper,!*">
    <mvcSiteMapNode title="About" controller="Home" action="About" visibility="SideMenu,BottomMenu,SiteMapPathHelper,!*"/>
    <mvcSiteMapNode title="Contact" controller="Home" action="Contact" visibility="TopMenu,SiteMapPathHelper,!*"/>
</mvcSiteMapNode>

如果您有更复杂的可见性规则,您甚至可以

请注意,可见性也会受到影响,但安全修剪始终会隐藏隐藏节点的所有子代节点。启用安全修整后,每个节点必须在安全方面可访问,并且根据可见性提供程序可见,以便在UI上可见


如果没有与当前页面匹配的节点,则基于级别的面包屑轨迹和菜单也将自动隐藏。请阅读以深入了解匹配行为。这仅适用于具有“id”或其他自定义参数的路由。

实现这一点的最佳方法是与IsItemaNodeVisibilityProvider一起使用。该框中有一个FilteredItemsNodeVisibilityProvider,可通过为每个菜单指定名称,用于仅在某些菜单实例上显示节点

1) 将VisibilityAffectsDescents设置为false,将默认可见性提供程序设置为FilteredItemsNodeVisibilityProvider

<appSettings>
    <add key="MvcSiteMapProvider_VisibilityAffectsDescendants" value="false"/>
    <add key="MvcSiteMapProvider_DefaultSiteMapNodeVisibiltyProvider" value="MvcSiteMapProvider.FilteredSiteMapNodeVisibilityProvider, MvcSiteMapProvider"/>
</appSettings>
3) 如前所述,设置每个节点的可见性属性。请记住,您还可以按HTML帮助器类型进行筛选

<mvcSiteMapNode title="Home" controller="Home" action="Index" visibility="TopMenu,BottomMenu,SiteMapPathHelper,!*">
    <mvcSiteMapNode title="About" controller="Home" action="About" visibility="SideMenu,BottomMenu,SiteMapPathHelper,!*"/>
    <mvcSiteMapNode title="Contact" controller="Home" action="Contact" visibility="TopMenu,SiteMapPathHelper,!*"/>
</mvcSiteMapNode>

如果您有更复杂的可见性规则,您甚至可以

请注意,可见性也会受到影响,但安全修剪始终会隐藏隐藏节点的所有子代节点。启用安全修整后,每个节点必须在安全方面可访问,并且根据可见性提供程序可见,以便在UI上可见


如果没有与当前页面匹配的节点,则基于级别的面包屑轨迹和菜单也将自动隐藏。请阅读以深入了解匹配行为。这仅适用于具有“id”或其他自定义参数的路由。

这应该会有所帮助。我的规则很简单——菜单X应该对每个人都可见,菜单Y应该基于角色可见。我已经了解到MvcSiteMapProvider可以处理“基于角色”的问题。我更新并更正了我的答案,加入了一个外部DI示例。确保将VisibilityAffectsDescendants设置为false(我之前的示例显示为true),否则菜单将始终隐藏不可见节点的后代节点。此外,请参阅更新的第3项,以始终显示面包屑痕迹中的项目。立即进行测试。顺便说一句,什么使用了
VisibilityAffectsDescents
VisibilityAffectsDescents
由菜单、站点地图和/SiteMap.xml端点使用。这应该会有所帮助。我的规则很简单——菜单X应该对每个人都可见,菜单Y应该基于角色可见。我已经了解到MvcSiteMapProvider可以处理“基于角色”的问题。我更新并更正了我的答案,加入了一个外部DI示例。确保将VisibilityAffectsDescendants设置为false(我之前的示例显示为true),否则菜单将始终隐藏不可见节点的后代节点。此外,请参阅更新的第3项,以始终显示面包屑痕迹中的项目。立即进行测试。顺便说一句,什么使用了
VisibilityAffectsDescents
VisibilityAffectsDescents
由菜单、站点地图和/SiteMap.xml端点使用。
<mvcSiteMapNode title="Home" controller="Home" action="Index" visibility="TopMenu,BottomMenu,SiteMapPathHelper,!*">
    <mvcSiteMapNode title="About" controller="Home" action="About" visibility="SideMenu,BottomMenu,SiteMapPathHelper,!*"/>
    <mvcSiteMapNode title="Contact" controller="Home" action="Contact" visibility="TopMenu,SiteMapPathHelper,!*"/>
</mvcSiteMapNode>