更改MVCSiteMapProvider面包屑深度

时间:2014-10-14 14:31:27

标签: asp.net-mvc asp.net-mvc-3 mvcsitemapprovider

我正在使用MVCSiteMapProvider和动态节点设置了包含面包屑的页面。似乎GetDynamicNodeCollection方法仅为面包屑设置直接父级,因此面包屑只显示两个级别。也就是说,如果您导航到层次结构中的第三级或第四级,请说:

  

(主页>第1级>第2级>第3级>第4级)

删除第一级或第二级只留下:

  

(主页>第3级>第4级)

但是,我不知道如何更新GetDynamicNodeCollection以允许正确显示整个痕迹路径。

1 个答案:

答案 0 :(得分:0)

选项#1

使用FilteredSiteMapNodeVisibilityProvider隐藏SiteMapPath帮助程序中1级和2级的节点。

public class MyDynamicNodeProvider
    : DynamicNodeProviderBase
{
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
    {
        // Level 1
        yield return this.MakeInvisibleOnSiteMapPath(
            new DynamicNode() 
            { 
                Key = "Level1Key",
                Title = "Level 1",
                Controller = "Home", 
                Action = "Level1"
            });


        // Level 2
        yield return this.MakeInvisibleOnSiteMapPath(
            new DynamicNode()
            {
                Key = "Level2Key",
                ParentKey = "Level1Key",
                Title = "Level2",
                Controller = "Home",
                Action = "Level2"
            });

        // Level 3
        yield return new DynamicNode()
            {
                Key = "Level3Key",
                ParentKey = "Level2Key",
                Title = "Level3",
                Controller = "Home",
                Action = "Level3"
            };
    }

    private DynamicNode MakeInvisibleOnSiteMapPath(DynamicNode dynamicNode)
    {
        // Setup visibility
        dynamicNode.VisibilityProvider = "MvcSiteMapProvider.FilteredSiteMapNodeVisibilityProvider, MvcSiteMapProvider";
        dynamicNode.Attributes.Add("visibility", "!SiteMapPathHelper");

        return dynamicNode;
    }
}

请注意,如果您在网站的不同区域有不同的可见性要求,则可以将其与named HTML helpers结合使用。如果您的要求更高,也可以build your own visibility provider

选项#2

如果您的节点可见性根据上下文而变化,您可能会考虑building your own HTML helper而不是使用内置的SiteMapPath帮助程序,因为它可能比使用可见性提供程序更容易。您只需要构建一个返回HTML字符串的MvcSiteMapHtmlHelper类的扩展方法。您可以通过对SiteMapPathHelper进行逆向工程来获得一些灵感。我已经建立了一个demo project来展示如何做到这一点。