通过代码在Orchard Core CMS中增加一个管理类菜单

通过模块向管理类菜单添加新的菜单项

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下已经成功添加菜单。

posted @ 2021-09-23 18:45  doknowmi  阅读(171)  评论(0编辑  收藏  举报