My aproach is from early XbK times, but it still works.
I use the "WebPageUrlPath" to achieve this.
public static async Task<List<IWebPageFieldsSource>> RetrieveBreadcrumbNodes(
IWebPageDataContextRetriever pageRetriever, RoutedWebPage page)
{
List<IWebPageFieldsSource> pageItems = [];
string fullPath = page.GetWebPageFieldsSource().Result.SystemFields.WebPageUrlPath;
List<string> breadcrumbPaths = [];
while (!string.IsNullOrWhiteSpace(fullPath))
{
breadcrumbPaths.Add(fullPath);
fullPath = fullPath.Contains('/')
? fullPath[..fullPath.LastIndexOf('/')]
: "";
}
ContentItemQueryBuilder builder = new ContentItemQueryBuilder()
.ForContentTypes(item =>
{
item.ForWebsite();
item.OfReusableSchema(IBasepage.REUSABLE_FIELD_SCHEMA_NAME);
})
.Parameters(outerQuery =>
{
outerQuery.Where(record =>
{
record.WhereIn(
nameof(WebPageFields.WebPageUrlPath),
breadcrumbPaths);
record.WhereFalse(
nameof(IBasepage.BasePageHideInBreadcrumb));
});
})
.InLanguage(pageRetriever.Retrieve().WebPage.LanguageName);
IContentQueryExecutor executor
= CMS.Core.Service.Resolve<IContentQueryExecutor>();
pageItems = (await executor.GetMappedWebPageResult<IWebPageFieldsSource>(builder))
.ToList();
return pageItems;
In the view I do this afterwards:
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
@foreach(IWebPageFieldsSource node in Model.BreadcrumbNodes)
{
if (Model.Page.SystemFields.WebPageItemID.Equals(node.SystemFields.WebPageItemID))
{
<li class="breadcrumb-item active" aria-current="page">@node.GetPageName()</li>
}
else
{
<li class="breadcrumb-item"><a href="/@node.SystemFields.WebPageUrlPath">@node.GetPageName()</a></li>
}
}
</ol>
</nav>