如何从菜单中隐藏MvcSiteMapNode而不是面包屑?

时间:2013-07-25 17:42:55

标签: c# asp.net-mvc mvcsitemapprovider

我有一个我 想要显示在菜单中的页面。但是,当我在页面上时,我希望它显示在面包屑中。

我正在尝试使用ISiteMapNodeVisibilityProvider类,但无法弄清楚如何确定提供的SiteMapNode参数是否在菜单或面包屑中。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

您可以通过检查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" })

答案 1 :(得分:-1)

过滤菜单项的简单方法是按角色。如果您未绑定到ISiteMapVisibilityProvider解决方案,则可以修改站点地图文件和/或使用“授权”属性。希望其中一个可以提供帮助。

Mvc.sitemap:
<mvcSiteMapNode title="Secret Page" controller="RestrictedController" action="SecretAction" key="SecretPage" roles="MySecretRole" />

Controller/Action:
[Authorize(Roles="MySecretRole")]

答案 2 :(得分:-1)

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>
}