我有一个我不想出现在菜单中的页面。但是,当我在页面上时,我确实希望它显示在面包屑中。
我试图用一个ISiteMapNodeVisibilityProvider
类来做到这一点,但不知道如何确定提供的SiteMapNode
参数是在菜单还是面包屑中。
我该怎么做呢?
我有一个我不想出现在菜单中的页面。但是,当我在页面上时,我确实希望它显示在面包屑中。
我试图用一个ISiteMapNodeVisibilityProvider
类来做到这一点,但不知道如何确定提供的SiteMapNode
参数是在菜单还是面包屑中。
我该怎么做呢?
您可以通过检查 sourceMetadata 参数的“HtmlHelper”元素来测试哪个 HTML 帮助程序正在调用可见性提供程序。此参数会自动传递到可见性提供程序。
使用的名称是类型的 FullName(没有程序集名称的完全限定名称)。
public class MyNodeNotOnMenuVisibilityProvider
: SiteMapNodeVisibilityProviderBase
{
public override bool IsVisible(ISiteMapNode node, IDictionary<string, object> sourceMetadata)
{
if (sourceMetadata.ContainsKey("HtmlHelper") && sourceMetadata["HtmlHelper"].ToString().Equals("MvcSiteMapProvider.Web.Html.MenuHelper"))
{
if (node.Key == "MyNode")
{
return false;
}
}
return true;
}
}
在 v4 中,您还可以使用 sourceMetadata 通过任何 HTML 帮助程序传递自定义信息,然后您还可以在自定义可见性提供程序中测试自定义信息。
@Html.MvcSiteMap().Menu(new { myInfo = "Something" })
过滤菜单项的一种简单方法是按角色。如果您未绑定到 ISiteMapVisibilityProvider 解决方案,则可以修改站点地图文件和/或使用 Authorize 属性。希望其中之一可以提供帮助。
Mvc.sitemap:
<mvcSiteMapNode title="Secret Page" controller="RestrictedController" action="SecretAction" key="SecretPage" roles="MySecretRole" />
Controller/Action:
[Authorize(Roles="MySecretRole")]
To hide the menu item but keep the breadcrumbs, follow this: Here i am removing the child node "Products", but it will show in breadcrumbs.
<ul id="menu-nav" class="sf-menu" style="position:relative;transform:translateX(-50%);left:50%;margin-top:0px;">
@foreach (var node in Model.Nodes) {
<li class="current">@Html.DisplayFor(m => node)
@if (node.Children.Any()) {
if(node.Children.Count > 0)
{
for(int n=0;n < node.Children.Count;n++)
{
if(node.Children[n].Title == "Products")
{
node.Children.RemoveAt(n);
}
}
@Html.DisplayFor(m => node.Children)
}
}
</li>
}