如何使用C#为2sxc的Hero横幅模块创建面包屑导航并获取当前页面父级名称
实现方案
用Dnn原生Tab控制器获取父页面名称
你现在的代码只拿到了父页面的ID,没根据ID拉取父页面的元数据,直接用Dnn自带的TabController就能解决,把原来的逻辑替换成下面的写法:
@using DotNetNuke.Entities.Tabs; @if (Dnn.Tab.ParentId != -1) { var parentTab = TabController.Instance.GetTab(Dnn.Tab.ParentId, Dnn.Portal.PortalId); <nav class="uppercase text-sm font-semibold tracking-wider"> <span class="text-honeydew visited:text-honeydew">@parentTab.TabName</span> <span>/</span> </nav> }
几个要注意的点:
- 查询的时候必须带上当前站点的PortalId,不然多站点运行的环境下很容易拿错其他站点的同ID页面名称
- 取
TabName属性就行,这个值就是你在Dnn后台给页面填的导航名称,刚好匹配你要的Scholarships页对应父页Teachers、Volunteer页对应父页Get Involved的效果 - 你原来判断根页面不显示面包屑的逻辑完全没问题,
ParentId == -1就是Dnn里顶层根页面的固定判定值,不用改
更适配2sxc环境的轻量化写法
既然你是在2sxc里做全站公用的Hero模块,更推荐用2sxc自带的Page服务,不用手动引Dnn核心的命名空间,后续升级2sxc版本也不容易出兼容问题:
@if (Dnn.Tab.ParentId != -1) { var parentTabName = Kit.Page.Parent?.Title; <nav class="uppercase text-sm font-semibold tracking-wider"> <span class="text-honeydew visited:text-honeydew">@parentTabName</span> <span>/</span> </nav> }
几个常见的坑提前提醒:
- 别直接用
Dnn.Tab.ParentTab这个原生属性,大部分Dnn版本下这个属性默认不会自动填充,直接调用百分百触发空引用报错 - 2sxc的
Kit.Page.Parent已经内置了权限校验、多站点隔离的逻辑,这种全站复用的通用模块用它最省心,以后要做二级、三级的多级面包屑,顺着Kit.Page.Parent.Parent往上遍历就行,不用自己额外写查询逻辑
内容的提问来源于stack exchange,提问作者Aaron - Wolf X Machina
相关产品推荐
相关产品推荐

