如何防止节点出现在面包屑 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> > </text>
【讨论】:
以上是关于如何防止节点出现在面包屑 MVC 中的主要内容,如果未能解决你的问题,请参考以下文章