通过模块向管理类菜单添加新的菜单项
INavigationProvider接口是与处理管理导航菜单项相关的每个任务的入口点。
为了从模块添加菜单项,您只需要创建一个实现该接口的类。
您将构建什么
您将构建一个模块,该模块将在根级别添加一个菜单项和两个子菜单项。
每个菜单项将指向其自己的视图。
您需要什么
当前版本的.NET SDK。你可以从这里下载https://dotnet.microsoft.com/download.。
一个文本编辑器和一个终端,您可以在其中键入DotNet命令。
创建Orchard Core CMS站点和模块
有不同的方式可以为Orchard Core创建站点和模块。你可以在这里了解更多关于它们的信息。
在本指南中,我们将使用我们的“代码生成模板”。
您可以使用以下命令安装最新发布的模板:
DotNet new-I OrchardCore.ProjectTemplates
创建将包含您的站点的空文件夹。打开终端,导航到该文件夹并运行以下命令:
dotnet new occms -n MySite
这将在名为MySite的新文件夹中创建一个新的Orchard Core CMS站点。
现在,我们可以使用以下命令创建一个新模块:
dotnet new ocmodulecms -n MyModule
该模块将在MyModule文件夹中创建。下一步是通过添加项目引用来引用应用程序中的模块:
dotnet add MySite reference MyModule
我们还需要引用OrchardCore.Admin包才能实现所需的接口:
dotnet add .\MyModule\MyModule.csproj package OrchardCore.Admin
添加我们的 controller and views
添加 controller
在文件夹.\MyModule\Controllers增加一个文件:DemoNavController.cs,内容如下:
using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using OrchardCore.Admin; namespace MyModule.Controllers { [Admin] public class DemoNavController : Controller { public ActionResult ChildOne() { return View(); } public ActionResult ChildTwo() { return View(); } } }
[Admin]属性确保控制器正在使用Admin主题,并且用户有权访问它。
另一种方法是将这个类命名为AdminController。
添加Views
在.\MyModule\Views下创建文件夹DemoNav,并增加两个视图:
ChildOne
<h2>View One</h2>
ChildTwo
<h2>View Two</h2>
添加菜单项
现在您只需要添加一个实现INavigationProvider接口的类。
按照惯例,我们将这些类称为AdminMenu.cs,并将其放在模块文件夹的根目录中。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Localization; using OrchardCore.Navigation; namespace MyModule { public class AdminMenu : INavigationProvider { private readonly IStringLocalizer S; public AdminMenu(IStringLocalizer<AdminMenu> localizer) { S = localizer; } public Task BuildNavigationAsync(string name, NavigationBuilder builder) { // We want to add our menus to the "admin" menu only. if (!String.Equals(name, "admin", StringComparison.OrdinalIgnoreCase)) { return Task.CompletedTask; } // Adding our menu items to the builder. // The builder represents the full admin menu tree. builder .Add(S["My Root View"], S["My Root View"].PrefixPosition(), rootView => rootView .Add(S["Child One"], S["Child One"].PrefixPosition(), childOne => childOne .Action("ChildOne", "DemoNav", new { area = "MyModule" })) .Add(S["Child Two"], S["Child Two"].PrefixPosition(), childTwo => childTwo .Action("ChildTwo", "DemoNav", new { area = "MyModule" }))); return Task.CompletedTask; } } }
如果您希望在字符串被翻译成其他语言时保持按字母顺序排序,我们建议对第二个参数(Position)使用Prefix Position扩展方法。
然后,您必须在模块的Startup.cs文件中注册该服务。
在Startup.cs文件的顶部,添加以下Using语句:
using OrchardCore.Navigation;
将此行添加到ConfigureServices()方法:
services.AddScoped<INavigationProvider, AdminMenu>();
测试生成的应用程序
从包含这两个项目的文件夹的根目录中,运行以下命令:
dotnet run --project .\MySite\MySite.csproj
使用左侧菜单转到Configuration:Feature,搜索您的模块MyModule并启用它。
现在您的模块已启用,您应该会在管理员上看到一个新条目。
单击新菜单项以呈现我们先前创建的视图。
在Configuration下已经成功添加菜单。