Asp.net mvc 更改MVCSiteMapProvider面包屑深度

Asp.net mvc 更改MVCSiteMapProvider面包屑深度,asp.net-mvc,asp.net-mvc-3,mvcsitemapprovider,Asp.net Mvc,Asp.net Mvc 3,Mvcsitemapprovider,我正在处理一个使用MVCSiteMapProvider和动态节点设置面包屑的页面。GetDynamicNodeCollection方法似乎只为breadcrumbs设置直接父级,因此breadcrumbs将只显示两级深度。也就是说,如果您导航到层次结构中的第三或第四级,请说: (主页>级别1>级别2>级别3>级别4) 第一层或第二层被移除,只留下: (主页>第3层>第4层) 但是,我不知道如何更新GetDynamicNodeCollection以允许正确显示整个面包屑痕迹。选项#1 使用从Sit

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

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

第一层或第二层被移除,只留下:

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

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

选项#1 使用从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;
    }
}
公共类MyDynamicNodeProvider
:dynamicodeProviderBase
{
公共重写IEnumerable GetDynamicNodeCollection(ISiteMapNode节点)
{
//一级
yield返回this.MakeInvisibleOnSiteMapPath(
新DynamicNode()
{ 
Key=“Level1Key”,
Title=“级别1”,
Controller=“Home”,
Action=“Level1”
});
//二级
yield返回this.MakeInvisibleOnSiteMapPath(
新DynamicNode()
{
Key=“Level2Key”,
ParentKey=“Level1Key”,
Title=“Level2”,
Controller=“Home”,
Action=“Level2”
});
//三级
新DynamicNode()的收益回报率
{
Key=“Level3Key”,
ParentKey=“Level2Key”,
Title=“Level3”,
Controller=“Home”,
Action=“Level3”
};
}
专用DynamicNode MakeInvisibleOnSiteMapPath(DynamicNode DynamicNode)
{
//设置可见性
dynamicNode.VisibilityProvider=“MvcSiteMapProvider.FilteredItemsNodeVisibilityProvider,MvcSiteMapProvider”;
添加(“可见性”、“!SiteMapPathHelper”);
返回动态节点;
}
}
请注意,如果您在站点的不同区域具有不同的可见性要求,则可以将其与一起使用。如果您的需求更高级,您也可以这样做

选项2

如果您的节点可见性根据上下文而改变,您可能会考虑使用内置的SITMePATAH助手,因为它可能比使用可见性提供程序更容易做到。您只需要构建一个返回HTML字符串的MvcSiteMapHtmlHelper类的扩展方法。你可以从逆向工程中得到一些灵感。我已经建立了一个演示如何做到这一点