Skill for creating and managing navigation menus in Orchard Core. Covers menu creation, navigation providers, admin menus, breadcrumbs, and menu content types. Use this skill when requests mention Orchard Core Navigation, Create Navigation and Menus, Enabling Navigation Features, Custom Admin Navigation Provider, Registering Navigation Provider, Menu Recipe (Creating a Menu via Recipe), or closely related Orchard Core implementation, setup, extension, or troubleshooting work. Strong matches include work with OrchardCore.Menu, OrchardCore.Navigation, OrchardCore.AdminMenu, INavigationProvider, IStringLocalizer, NavigationBuilder, IServiceCollection, MenuPart, MenuItemsListPart, LinkMenuItemPart, ContentMenuItemPart, LinkMenuItem. It also helps with navigation examples, Registering Navigation Provider, Menu Recipe (Creating a Menu via Recipe), Rendering Menu in Liquid Template, plus the code patterns, admin flows, recipe steps, and referenced examples captured in this skill.
You are an Orchard Core expert. Generate navigation menus, admin menus, and menu items for Orchard Core.
OrchardCore.Menu and OrchardCore.Navigation for menu support.Menu.LinkMenuItem, ContentMenuItem).INavigationProvider implementations.Position property to control menu item ordering (lower numbers appear first)."1", "1.1", "1.2" for nested items.{
"steps": [
{
"name": "Feature",
"enable": [
"OrchardCore.Menu",
"OrchardCore.Navigation",
"OrchardCore.AdminMenu"
],
"disable": []
}
]
}
using Microsoft.Extensions.Localization;
using OrchardCore.Navigation;
public sealed class AdminMenu : INavigationProvider
{
private readonly IStringLocalizer S;
public AdminMenu(IStringLocalizer<AdminMenu> localizer)
{
S = localizer;
}
public ValueTask BuildNavigationAsync(string name, NavigationBuilder builder)
{
if (!string.Equals(name, "admin", StringComparison.OrdinalIgnoreCase))
{
return ValueTask.CompletedTask;
}
builder
.Add(S["{{MenuGroupName}}"], NavigationConstants.AdminMenuSettingsPosition, settings => settings
.AddClass("{{icon-class}}")
.Id("{{menuId}}")
.Add(S["{{SubMenuName}}"], S["{{SubMenuName}}"].PrefixPosition(), item => item
.Action("Index", "Admin", new { area = "{{ModuleName}}" })
.Permission(Permissions.{{PermissionName}})
.LocalNav()
)
);
return ValueTask.CompletedTask;
}
}
public sealed class Startup : StartupBase
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddScoped<INavigationProvider, AdminMenu>();
}
}
{
"steps": [
{
"name": "Content",
"data": [
{
"ContentItemId": "main-menu",
"ContentType": "Menu",
"DisplayText": "Main Menu",
"Latest": true,
"Published": true,
"MenuPart": {},
"MenuItemsListPart": {
"MenuItems": [
{
"ContentType": "LinkMenuItem",
"ContentItemId": "menu-home",
"LinkMenuItemPart": {
"Name": "Home",
"Url": "~/"
}
},
{
"ContentType": "LinkMenuItem",
"ContentItemId": "menu-about",
"LinkMenuItemPart": {
"Name": "About",
"Url": "~/about"
}
},
{
"ContentType": "LinkMenuItem",
"ContentItemId": "menu-contact",
"LinkMenuItemPart": {
"Name": "Contact",
"Url": "~/contact"
}
}
]
}
}
]
}
]
}
{% shape "Menu", alias: "main-menu" %}
Enable OrchardCore.Menu for breadcrumb support:
{% zone "Breadcrumbs" %}
To add a content item as a menu item:
{
"ContentType": "ContentMenuItem",
"ContentItemId": "menu-blog",
"ContentMenuItemPart": {
"ContentItem": {
"ContentItemId": "{{BlogContentItemId}}"
}
}
}