C# 如何防止节点出现在面包屑MVC中

C# 如何防止节点出现在面包屑MVC中,c#,asp.net-mvc-5,nodes,mvcsitemapprovider,sitemappath,C#,Asp.net Mvc 5,Nodes,Mvcsitemapprovider,Sitemappath,我的解决方案中的某些节点需要出现在菜单/导航中,但不会出现在面包屑中,因为它们不会链接到实际页面,因此单击时只会出现错误。我在这里尝试了几种与高级节点可见性相关的技术:但我似乎无法让它对我起作用。一位同事建议可能在SiteMapPathHelper类中为SiteMapPath方法设计一个重载,但我不确定这是否准确,或者它的格式如何。我是MVC新手,需要一些帮助。谢谢 感谢@NightOwl888的回复!我将添加更多的细节,以确保我得到的东西是正确的。这是站点地图文件中节点部分的示例: “库

我的解决方案中的某些节点需要出现在菜单/导航中,但不会出现在面包屑中,因为它们不会链接到实际页面,因此单击时只会出现错误。我在这里尝试了几种与高级节点可见性相关的技术:但我似乎无法让它对我起作用。一位同事建议可能在SiteMapPathHelper类中为SiteMapPath方法设计一个重载,但我不确定这是否准确,或者它的格式如何。我是MVC新手,需要一些帮助。谢谢


感谢@NightOwl888的回复!我将添加更多的细节,以确保我得到的东西是正确的。这是站点地图文件中节点部分的示例:


“库存管理”表示用户导航到的初始页面,其中显示标题为“集团库存”的菜单(第二个节点),菜单项为标题下方的项目(“集团库存管理”、“管理所有集团库存”和“搜索库存”)。每个菜单项都是指向其他页面的链接,但菜单标题不是链接,不可单击。当我导航到其中一个菜单项时,菜单标题(“组库存”)会显示在面包屑显示中,即使它没有链接到任何内容。因此,基本上,如果我单击第一个菜单项,它会显示“主页>库存管理>组库存>组库存管理”,如果用户单击“组库存”,则会导致错误。我需要防止“组库存”仅显示在面包屑痕迹中。我正努力从你最初的反应中弄明白这一点


另外,根据我迄今为止看到的示例,我添加了组资源清册节点中的一些属性以试图隐藏它。

A
SiteMapNode
表示网站或外部网站上的真实位置(除了不可单击的分组节点(即
clickable
属性设置为false的节点,这只是为了确保您仍然拥有不代表真实位置的节点层次结构)。
SiteMapNodes
是节点的服务器端表示形式,您可以将其视为层次数据库

如果您想在客户端的菜单中添加其他链接(可能是为了某些JavaScript功能),您可以自定义
/Views/Shared/DisplayTemplates/
目录中的菜单帮助器模板。如果需要,您可以将自己的节点添加到特定节点,以准确地向模板发送添加客户端链接的信号

有关如何实现这一点的更多想法,请参阅

相关的:


在不可单击的分组节点上,已为可见性指定:
visibility=“SiteMapPathHelper,!*”


假设已按照将默认可见性提供程序设置为FilteredItemsNodeVisibilityProvider,则具体告诉它“使节点在面包屑路径上可见,但不在其他任何位置”(菜单、站点地图、XML站点地图等)。因此,它正在执行您指定要执行的操作。但是,您尚未指定希望它执行的操作。可能您的意思是
!SiteMapPathHelper
,这意味着“使节点在除面包屑痕迹之外的任何地方都可见”?

我找到了一个超出我预期范围的解决方案。我为需要隐藏的特定节点添加了一个名为“isbreadcrumbhidden”的属性。然后,我能够在SiteMapPathHelperModel.cshtml(构建breadcrumb字符串的视图)中进行检查,以排除任何具有“isbreadcrumbhidden”的节点属性设置为“true”。我喜欢该解决方案,因为我不必对代码进行任何广泛的更改或添加,只需对单个属性进行更改或添加。下面是视图中的代码:

@foreach (var node in Model) {
    if (!node.Attributes.ContainsKey("isbreadcrumbhidden") || (node.Attributes.ContainsKey("isbreadcrumbhidden") && node.Attributes["isbreadcrumbhidden"].ToString() == "false"))
    {
        @Html.DisplayFor(m => node);

            if (node != Model.Last()) {
                <text> &gt; </text>
        }
    }
}
@foreach(模型中的var节点){
如果(!node.Attributes.ContainsKey(“isbreadcrumbhidden”)| |(node.Attributes.ContainsKey(“isbreadcrumbhidden”)&&node.Attributes[“isbreadcrumbhidden”].ToString()=“false”))
{
@DisplayFor(m=>node);
if(node!=Model.Last()){
}
}
}

谢谢你的回复。我在原始帖子中添加了更多细节,因为我无法将其全部放在评论中。如果你有机会,请你看一看吗?我知道你很忙,我在研究这些东西时到处都能看到你。:)好吧,看来我把那部分倒过来了,因为你是对的,我希望它出现在任何地方,除了面包屑痕迹。我试着把它换成!SiteMapPathHelper,但这也不起作用,因此我必须正确设置某些内容。我还注意到另一个异常情况,即如果我单击组中的第二个节点“管理所有组库存”,则“组库存”不会出现在面包屑路径中。不确定造成这种情况的节点之间有什么不同。我更新了答案。