This blog post describes a prototype ASP.NET Core razor pages view component that renders a breadcrumb based on the information architecture of the website as determined by its URL hierarchy. This post is a continuation of a series progressing an ASP.NET razor pages solution architecture using the Contentstack SaaS headless CMS.
Update 15.Dec.2025: After years of frustration with WordPress, I am finally abandoning this blog. The content will likely stay here for some time, but new content will appear here:
The following post contains additional details about a top navigation component that uses the same architecture.
For a breadcrumb, we want to output a link to each ancestor of the current page and then the navigation title of the current page.
Here is the breadcrumb class.
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading.Tasks;
using Deliverystack.DeliveryApi.Models;
using Deliverystack.Models;
using System;
using System.Linq;
public class Breadcrumb : ViewComponent
{
public class BreadcrumbModel
{
public PathApiEntryModel[] Ancestors { get; set; }
public PathApiEntryModel Self { get; set; }
public static BreadcrumbModel GetFromResults(PathApiResultModel data)
{
var result = new BreadcrumbModel();
var enumerator = data.Entries.GetEnumerator();
List<PathApiEntryModel> entries = new List<PathApiEntryModel>();
while (enumerator.MoveNext())
entries.Add(enumerator.Current);
result.Ancestors = entries.ToArray().Take(entries.Count - 1).ToArray();
result.Self = entries.Last();
return result;
}
}
private PathApiClient _client;
public Breadcrumb(PathApiClient client)
{
_client = client;
}
// May 18 2021 - logic is synchronous and lightweight; ignore warnings about async
#pragma warning disable CS1998
public async Task<IViewComponentResult> InvokeAsync()
{
return View(BreadcrumbModel.GetFromResults(
_client.Get(new PathApiBindingModel()
{ Path = this.HttpContext.Request.Path, Ancestors = Int32.MaxValue })));
}
#pragma warning restore CS1998 // Rethrow to preserve stack details
}
Here is the razor view template for this class.
@model Breadcrumb.BreadcrumbModel
@{
foreach (var ancestor in Model.Ancestors)
{
<a href="@ancestor.Url">@ancestor.NavTitle</a> @: >
}
if (Model.Self != null)
{
@Model.Self.NavTitle
}
}
Here is invoking this razor pages view component from the layout.
@await Component.InvokeAsync("Breadcrumb")
One thought on “-SaaS Headless CMS ASP.NET Core Razor Pages Data-Driven Breadcrumb View Component”