☰
Orchard Core 模块化 MVC 应用实战:从零创建 Web 应用与自定义模块
2026/9/28 21:16:55 网站建设 项目流程
  • CMS
  • 后端
  • Web框架

【免费下载链接】OrchardCore

Orchard Core is an open-source modular and multi-tenant application framework built with ASP.NET Core, and a content management system (CMS) built on top of that framework.

项目地址:https://gitcode.com/gh_mirrors/or/OrchardCore
点击查看免费下载

导读

本指南基于 Orchard Core 官方文档《Creating a modular ASP.NET Core application》,手把手带你用dotnet new代码生成模板创建一套「Web 应用 + 模块」的最小可运行示例:Web 应用负责提供页面布局,模块负责注册路由并响应首页请求,两者通过 MVC 的 Area 机制天然解耦。读完本文你将掌握ocmvc与ocmodulemvc两个模板的完整使用流程、模块清单(Manifest)与StartupBase的工作原理、默认{area}/{controller}/{action}路由规则以及如何改写自定义路由,并能在 OrchardCore.Mvc.Web 与 OrchardCore.Mvc.HelloWorld 两个仓库示例中找到一一对应的源码证据。

你要构建什么

你将构建一个与 Orchard Core 自带示例 "Hello World" 应用类似的模块化 ASP.NET Core MVC 应用程序,由两部分组成:

  • 一个 Web 应用:作为宿主项目,提供整体页面布局(Layout);
  • 一个模块:注册路由并响应首页请求。

模块中的控制器、Action 与视图独立存在于模块项目内,而页面布局却来自 Web 应用项目——这正是 Orchard Core「模块化」的核心:职责分离、按需装配。

仓库中与本指南一一对应的参考项目为:

角色仓库路径
Web 应用宿主src/OrchardCore.Mvc.Web
Hello World 模块src/OrchardCore.Modules/OrchardCore.Mvc.HelloWorld

环境准备

开始之前,你需要具备:

  • 当前版本的 .NET SDK(可从 https://dotnet.microsoft.com/download 下载);
  • 一个文本编辑器 + 一个可运行dotnetCLI 命令的终端。

创建 Orchard Core 站点与模块

创建站点和模块有多种方式,官方模板文档见 Code Generation Templates。本文使用 Orchard Core 官方的代码生成模板(Code Generation Templates),其源码位于 src/Templates/OrchardCore.ProjectTemplates。

1. 安装模板

在终端中执行以下命令,安装最新稳定版模板:

dotnet new install OrchardCore.ProjectTemplates@3.0.1-*

[!NOTE] 若想使用main开发分支上的模板,请附加预览源:

dotnet new install OrchardCore.ProjectTemplates@3.0.1-* --nuget-source https://nuget.cloudsmith.io/orchardcore/preview/v3/index.json

关于稳定版与开发分支版本的选择说明,可参考 templates 文档中的dotnet new install OrchardCore.ProjectTemplates@3.0.1与@3.0.1-*两种安装方式。

2. 创建空目录与 Web 应用

新建一个名为OrchardCore.Mvc的空文件夹存放所有项目,进入该目录后执行:

dotnet new ocmvc -n OrchardCore.Mvc.Web

ocmvc即 "Orchard Core Mvc Web App" 模板的短名称(shortName),其模板配置定义在 OrchardCore.Templates.Mvc.Web/.template.config.src/template.json。该模板还支持两个可选参数:

  • -f|--framework:目标框架,模板默认值由构建过程注入(当前仓库对应net10.0);
  • -ov|--orchard-version:指定使用的 Orchard Core 包版本。

3. 创建 "Hello World" 模块

继续在同一目录执行:

dotnet new ocmodulemvc -n OrchardCore.Mvc.HelloWorld

ocmodulemvc即 "Orchard Core Mvc Module" 模板,配置见 OrchardCore.Templates.Mvc.Module/.template.config.src/template.json,同样支持-f|--framework与-ov|--orchard-version两个参数。

4. 添加项目引用(关键步骤)

[!IMPORTANT] 必须为Web 应用添加指向模块的项目引用,否则 Orchard Core 无法发现并加载该模块。

dotnet add OrchardCore.Mvc.Web reference OrchardCore.Mvc.HelloWorld

这一步的产物在仓库示例中体现为 OrchardCore.Mvc.Web.csproj 中的<ProjectReference Include="..\OrchardCore.Modules\OrchardCore.Mvc.HelloWorld\OrchardCore.Mvc.HelloWorld.csproj" />。

5.(可选)创建解决方案文件

若想在 Visual Studio 中以解决方案方式打开,可创建.sln并加入两个项目:

dotnet new sln -n OrchardCore.Mvc dotnet sln add OrchardCore.Mvc.Web\OrchardCore.Mvc.Web.csproj dotnet sln add OrchardCore.Mvc.HelloWorld\OrchardCore.Mvc.HelloWorld.csproj

测试运行结果

在同时包含两个项目的OrchardCore.Mvc根目录下启动 Web 应用:

dotnet run --project .\OrchardCore.Mvc.Web\OrchardCore.Mvc.Web.csproj

[!NOTE] 若使用的是模板的开发分支,启动前先执行:dotnet restore .\MySite\MySite.csproj --source https://nuget.cloudsmith.io/orchardcore/preview/v3/index.json

应用启动后默认监听以下端口:

Now listening on: https://localhost:5001 Now listening on: http://localhost:5000 Application started. Press Ctrl+C to shut down.

(仓库示例的 launchSettings.json 中同样以http://localhost:5000作为launchUrl。)

打开浏览器访问:

https://localhost:5001/OrchardCore.Mvc.HelloWorld/Home/Index

页面将显示Hello from OrchardCore.Mvc.HelloWorld。

布局来自主 Web 应用项目,而控制器、Action 与视图均来自模块项目。这一行为在仓库中可以直接验证:

  • 布局由 Web 应用的 Views/Shared/_Layout.cshtml 提供,其中<main>@RenderBody()</main>渲染模块视图的输出;
  • 控制器、Action 与视图来自模块的 Controllers/HomeController.cs 与 Views/Home/Index.cshtml。

注册自定义路由

默认路由规则

默认情况下,模块内所有路由遵循{area}/{controller}/{action}模式,其中{area}就是模块名。因此模块的HomeController.Index默认地址为:

/OrchardCore.Mvc.HelloWorld/Home/Index

改写模块路由以响应首页

在模块OrchardCore.Mvc.HelloWorld的Startup.cs中,于Configure()方法里添加自定义路由:

routes.MapAreaControllerRoute( name: "Home", areaName: "OrchardCore.Mvc.HelloWorld", pattern: "", defaults: new { controller = "Home", action = "Index" } );

参数说明:

参数含义
name路由名称,用于 URL 生成(如Url.RouteUrl/ TagHelper 的asp-route)
areaNameArea 名称,必须与模块名一致,用于隔离不同模块的路由表
patternURL 模式,空字符串表示匹配站点根路径(首页)
defaults默认路由值,指定命中的控制器与 Action

这与仓库示例 OrchardCore.Mvc.HelloWorld/Startup.cs 中的实现完全一致。模块的Startup类继承自OrchardCore.Modules.StartupBase,其Configure签名接收IApplicationBuilder、IEndpointRouteBuilder与IServiceProvider,这正是模块能够向应用注册路由的入口。

修改视图内容

同时,可以把模块Views/Home目录下的Index.cshtml修改为:

<h1>Hello World</h1>

(仓库示例的 Index.cshtml 使用了 Bootstrap 卡片样式展示 "Hello World" 消息,你可以按需简化。)

验证效果

重启应用,直接访问首页:

https://localhost:5001

即可看到Hello World消息。此时请求https://localhost:5001/OrchardCore.Mvc.HelloWorld/Home/Index与https://localhost:5001/会命中同一个控制器 Action——前者走默认{area}/{controller}/{action}规则,后者走自定义的空 pattern 路由。

从源码理解模块化机制

模块清单:Manifest.cs

模板生成的模块自带 Manifest.cs,它通过特性标记声明「这是一个 Orchard Core 模块」:

using OrchardCore.Modules.Manifest; [assembly: Module( Name = "Mvc HelloWorld" )]

ModuleAttribute是 Orchard Core 识别模块的唯一入口,还可以继续补充Author、Website、Version、Description等元数据。详细的特性示例可参考 Code Generation Templates 文档中的ocmodulecms模块清单示例。

模块项目为何能被识别为模块

模板生成的模块项目(OrchardCore.Templates.Mvc.Module.csproj)通过引用OrchardCore.Module.Targets包将自身标记为模块;在仓库源码中对应 OrchardCore.Module.Targets.csproj,其描述明确写道:"Converts project/library into an OrchardCore Module that can be referenced in OrchardCore modular application",并通过打包进包的build\目录下的 props/targets 文件在构建期生效。模块项目还需同时具备:

  • <Sdk="Microsoft.NET.Sdk.Razor">与<AddRazorSupportForMvc>true</AddRazorSupportForMvc>,以便编译 Razor 视图;
  • <FrameworkReference Include="Microsoft.AspNetCore.App" />。

Web 应用如何变成模块化宿主

模板生成的 Web 应用(OrchardCore.Templates.Mvc.Web.csproj)引用OrchardCore.Application.Mvc.Targets包,仓库源码 OrchardCore.Application.Mvc.Targets.csproj 将其描述为"Converts the application into a modular application and adds Asp.Net MVC pipeline"——它聚合了OrchardCore.Application.Targets(应用级模块装载)与OrchardCore.Mvc.Core(MVC 管道)。

而 Web 应用的 Program.cs 则是最小化入口:

var builder = WebApplication.CreateBuilder(args); builder.Services .AddOrchardCore() .AddMvc(); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); } app.UseStaticFiles(); app.UseOrchardCore(); await app.RunAsync();

其中AddOrchardCore()注册模块系统,.AddMvc()引入 ASP.NET Core MVC,UseOrchardCore()挂载 Orchard Core 中间件管线。模板生成的 Program.cs 结构与此一致,并额外包含了生产环境下的UseHsts()、UseHttpsRedirection()等默认配置。

路由、Area 与模块的隔离

Orchard Core 将每个模块映射为一个 ASP.NET Core Area,Area 名即模块名。MapAreaControllerRoute在 Area 内部注册路由,从而保证不同模块的路由互不干扰;同时由于 Area 隔离,模块的视图默认渲染在宿主应用的_Layout.cshtml中,实现了「模块提供内容、宿主提供外观」的机制。仓库中Startup基类的定义位于 OrchardCore.Modules 命名空间,模块与 Web 应用的装配逻辑则在 OrchardCore.Application.Targets 的 targets 文件中完成。

总结

至此,你已成功使用 Orchard Core 创建了一个模块化 ASP.NET Core MVC 应用,其中:

  • Web 应用作为宿主,负责整体布局与 Orchard Core 管线的装配;
  • 自定义模块负责注册路由、提供控制器与视图,并响应首页请求。

这套「宿主 + 模块」的结构是 Orchard Core 框架(区别于完整 CMS)最典型的用法:你可以持续添加更多模块、为每个模块配置独立路由与 Area 隔离,从而以标准 ASP.NET Core MVC 的方式构建高度可扩展、可插拔的应用程序。

仓库中的可继续探索资源:

  • 模板源码与配置:src/Templates/OrchardCore.ProjectTemplates/content(含OrchardCore.Templates.Mvc.Web与OrchardCore.Templates.Mvc.Module两个模板项目)
  • 完整示例宿主:src/OrchardCore.Mvc.Web
  • 完整示例模块:src/OrchardCore.Modules/OrchardCore.Mvc.HelloWorld
  • 模板安装与使用总览:src/docs/getting-started/templates/README.md
  • 模块标记包:src/OrchardCore/OrchardCore.Module.Targets
  • 模块化 MVC 应用聚合包:src/OrchardCore/OrchardCore.Application.Mvc.Targets
  • CMS
  • 后端
  • Web框架

【免费下载链接】OrchardCore

Orchard Core is an open-source modular and multi-tenant application framework built with ASP.NET Core, and a content management system (CMS) built on top of that framework.

项目地址:https://gitcode.com/gh_mirrors/or/OrchardCore
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询