我正在使用MVCSiteMapProvider和动态节点设置了包含面包屑的页面。似乎GetDynamicNodeCollection方法仅为面包屑设置直接父级,因此面包屑只显示两个级别。也就是说,如果您导航到层次结构中的第三级或第四级,请说:
(主页>第1级>第2级>第3级>第4级)
删除第一级或第二级只留下:
(主页>第3级>第4级)
但是,我不知道如何更新GetDynamicNodeCollection以允许正确显示整个痕迹路径。
答案 0 :(得分:0)
使用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。
如果您的节点可见性根据上下文而变化,您可能会考虑building your own HTML helper而不是使用内置的SiteMapPath帮助程序,因为它可能比使用可见性提供程序更容易。您只需要构建一个返回HTML字符串的MvcSiteMapHtmlHelper类的扩展方法。您可以通过对SiteMapPathHelper进行逆向工程来获得一些灵感。我已经建立了一个demo project来展示如何做到这一点。