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

时间:2017-01-17 17:49:01

标签: c# asp.net-mvc-5 nodes mvcsitemapprovider sitemappath

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

谢谢@ NightOwl888的回复!我还要添加一些细节,以确保我能够正确处理问题。这是Sitemap文件中节点部分的示例:

<mvcSiteMapNode title="Inventory Management" url="~/Resources/Inventory/Default.aspx"> <mvcSiteMapNode title="Group Inventory" action="#" visibility="SiteMapPathHelper,!*" clickable="false"> <mvcSiteMapNode title="Group Inventory Management" url="~/Resources/Inventory/UnitInventory" controller="GroupInventory" action="Index" /> <mvcSiteMapNode title="Manage All Group Inventory" url="~/Resources/Inventory/ManageAllGroupInventory.aspx"> <mvcSiteMapNode title="Manage Inventory Item" url="~/Resources/Inventory/ManageInventoryItem.aspx" /> </mvcSiteMapNode> <mvcSiteMapNode title="Search Inventory" url="~/Resources/Inventory/SearchInventory.aspx?module=resource" /> </mvcSiteMapNode> </mvcSiteMapNode>

&#34;库存管理&#34;表示用户导航到的初始页面,其中显示的菜单标题为&#34; Group Inventory&#34; (第二个节点),菜单项是下面的项目(&#34;组库存管理&#34;,&#34;管理所有组库存&#34;和&#34;搜索库存&#34;) 。每个菜单项都是指向其他页面的链接,但菜单标题不是链接,不可点击。当我导航到其中一个菜单项时,菜单标题(&#34; Group Inventory&#34;)显示在面包屑显示中,即使它没有链接到任何内容。所以基本上如果我点击第一个菜单项,它会显示&#34; Home&gt;库存管理&gt;群组广告资源&gt;群组库存管理&#34;,如果用户点击&#34;群组库存&#34;它会导致错误。我需要阻止&#34; Group Inventory&#34;从只显示面包屑的踪迹。我从你最初的反应中努力解决这个问题。

P.S。根据我迄今为止看到的示例,“群组资源清单”节点中的某些属性是我为尝试隐藏它而添加的属性。

2 个答案:

答案 0 :(得分:0)

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

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

有关如何实现此目标的更多信息,请参阅MvcSiteMapProvider hidden mvcSiteMapNode with CRUD operation

相关:

在不可点击的分组节点上,您已指定可见性:visibility="SiteMapPathHelper,!*"

假设您已根据documentation将默认可见性提供程序设置为FilteredSiteMapNodeVisibilityProvider,您明确告诉它&34;使节点在痕迹路径上可见,但不能在其他任何地方看到&#34 ; (菜单,站点地图,XML站点地图等)。因此,它正在完成您指定的操作。但是,您尚未指定期待它要执行的操作。也许你的意思是!SiteMapPathHelper,这意味着&#34;让节点在任何地方都可见但面包屑痕迹&#34;?

答案 1 :(得分:0)

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

@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>
        }
    }
}