A basic implemenation of a controller is to set an Index() action that is resolving the current node and parse the node to the view to get data rendered.
public class PageController : Controller
{
private IHttpContextAccessor _httpContextAccessor;
private NodeAccess _nodeAccess;
public PageController(IHttpContextAccessor httpContextAccessor, NodeAccess nodeAccess)
{
_httpContextAccessor = httpContextAccessor;
_nodeAccess = nodeAccess;
}
public IActionResult Index()
{
var model = new PageViewModel();
var currentPath = _httpContextAccessor.HttpContext.Request.Path.Value;
model.RequestPath = currentPath;
model.Node = GetNodeFromPath(currentPath);
return View(model);
}
private NodeDataModel GetNodeFromPath(string path)
{
var rootItems = _nodeAccess.GetRootItems();
var home = rootItems.FirstOrDefault(r => r.NodeType.Name.Equals("Home"));
if (string.IsNullOrEmpty(path) || path.Equals("/"))
{
return home;
}
var current = home;
foreach (var s in path.TrimStart('/').TrimEnd('/').Split('/'))
{
current = _nodeAccess.GetChildren(current.Id).FirstOrDefault(c => c.Name.Equals(s, StringComparison.OrdinalIgnoreCase));
if (current == null)
{
break;
}
}
return current;
}
}
Do not forget to add endpoints to the created controller.
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "defaultRoute",
pattern: "{controller=Page}/{action=Index}/{id?}"
);
endpoints.MapControllerRoute(
name: "catchAll",
pattern: "{**slug}",
defaults: new { controller = "Page", action = "Index" }
);
});