Asp.net mvc 4 使用MvcSiteMapProvider显示部分节点级别
我正在使用MVC4的MvcSiteMapProvider(v4.6.1)来处理面包屑和菜单。我已经阅读了关于安装、配置和使用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的用户将无法在其菜单上看到授权 不过,我想要的是只显示一些项目:主页和
@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>