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

Posted

技术标签:

【中文标题】如何防止节点出现在面包屑 MVC 中【英文标题】:How to prevent a node from appearing in breadcrumbs MVC 【发布时间】:2017-01-17 17:49:01 【问题描述】:

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


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

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

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

附:根据我目前看到的示例,我添加了 Group Inventory 节点中的一些属性以尝试隐藏它。

【问题讨论】:

我更新了答案。 【参考方案1】:

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

如果您想将其他链接添加到客户端的菜单中(可能用于某些 javascript 功能),您可以自定义 /Views/Shared/DisplayTemplates/ 目录中的菜单帮助程序模板。如果需要,您可以将自己的 custom attributes 添加到特定节点,以指示您的模板在哪里添加客户端链接。

请参阅MvcSiteMapProvider hidden mvcSiteMapNode with CRUD operation 了解如何实现此目的的更多信息。

相关:

MvcSiteMap generating a Menu without messing the breadcumbs How to render specific Sitemap section using mvcsitemapprovider MvcSiteMapProvider No Separetor

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

假设您已根据documentation 将默认可见性提供程序设置为FilteredSiteMapNodeVisibilityProvider,则您明确告诉它“使节点在面包屑路径上可见,但在其他任何地方都不可见”(菜单、站点地图、XML 站点地图等)。所以,它正在做你指定要做的事情。但是,您还没有指定期望它做什么。也许您的意思是!SiteMapPathHelper,意思是“让节点在除面包屑路径之外的任何地方都可见”?

【讨论】:

感谢您的回复。我已在原始帖子中添加了其他详细信息,因为我无法将其全部放在评论中。如果你有机会,你能看看吗?我知道你很忙,我在研究这些东西的时候到处都能看到你。 :) 好吧,看来我把那部分倒了,因为你是对的,我希望它出现在除了面包屑路径之外的任何地方。我尝试将其切换到!SiteMapPathHelper,但这也不起作用,所以我一定没有正确设置。我还注意到另一个异常情况,如果我单击组中的第二个节点“管理所有组库存”,那么“组库存”不会 出现在面包屑路径中。不确定会导致这种情况的节点之间有什么不同。【参考方案2】:

我能够找到一些超出我预期范围的解决方案。我向需要隐藏的特定节点添加了一个名为“isbreadcrumbhidden”的属性。然后,我能够检查 SiteMapPathHelperModel.cshtml,即构建面包屑字符串的视图,以排除任何将“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>
        
    

【讨论】:

以上是关于如何防止节点出现在面包屑 MVC 中的主要内容,如果未能解决你的问题,请参考以下文章

MVC:面包块而不是面条|精选博客

drupal中具有不同父节点的节点的菜单和面包屑

如何在 JavaScript 中的子项之间遍历以从 JSON 创建面包屑 UI

php 从Drupal 8节点的分类术语中加载面包屑

java 防止面包堆到一起

在 ASP.NET MVC 站点中实现 Session 的公认模式是啥?