选项 #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 来展示如何做到这一点。