ASP.NET Core MVC 添加Area和Route配置
什么是区域Area?
区域Area是一项 ASP.NET 功能,用于将相关功能整理到一个组中作为:
路由的命名空间。
视图和 Razor Pages 的文件夹结构。
使用区域会通过为 controller 和 action 或 Razor 页面 page 添加另一个路由参数 area,创建用于路由目的的层次结构。
区域提供了一种将 ASP.NET Core Web 应用划分为更小的功能组的方法,每个功能组都有自己的一组 Razor Pages、控制器、视图和模型。 区域实际上是应用内的结构。 在 ASP.NET Core Web 项目中,Pages、模型、控制器和视图等逻辑组件保存在不同的文件夹中。 ASP.NET Core 运行时使用命名约定来创建这些组件之间的关系。 对于大型应用,将应用分区为独立的高级功能区域可能更有利。 例如,具有多个业务单位(如结账、计费、搜索等)的电子商务应用。 每个单位都有自己的区域,用于包含视图、控制器、Razor Pages 和模型。
什么时候使用区域Area?
应用由可以进行逻辑分隔的多个高级功能组件组成时使用区域Area。
想对应用进行分区,以便可以独立处理每个功能区域。
如何添加区域Area?
添加方法是在对应的项目右键>添加>新搭建基架的项目,然后选择MVC区域,这样会添加Area区域为你自动创建Area文件夹结构。
如果第一次添加时,可能会先提示安装包,安装好后会添加完成。
添加完成后生成的目录截图如图所示。
并且在根目录自动创建了ScaffoldingReadMe.txt文件,里面有配置route的示例。
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name : "areas",
pattern : "{area:exists}/{controller=Home}/{action=Index}/{id?}"
);
});
使用[Area]属性关联控制器与区域
在区域Area文件夹下的Controllers文件夹里添加Controller后,要使用[Area]属性为控制器进行指定区域。这一步很重要,如果不指定,后面的Route路由配置可能无法按预期生效。
[Area("Manage")]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
这里与以前旧的MVC有差别,旧的MVC创建区域后会在区域文件夹下自动生成{AreaName}AreaRegistration.cs文件包含了区域名称和Route配置,.NET Core MVC里是没有这个文件的,需要自己在Controller文件里指定区域。
如何配置Area路由Route?
使用MapControllerRoute创建简单路由
如果所有区域的 url 空间一致,则 {area:...} 可用作路由模板中的令牌,下面是一个带路由配置的program.cs代码示例
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();var app = builder.Build();if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();app.MapControllerRoute(
name: "MyArea",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
在前面的代码中,exists 应用了路由必须与区域匹配的约束。 将 {area:...} 与 MapControllerRoute 结合使用:
将路由添加到区域的最简单的机制。
将所有控制器与 [Area("Area name")] 特性相匹配。
使用MapAreaControllerRoute创建多个命名区域路由
app.MapAreaControllerRoute(
name: "Manage",
areaName: "Manage",
pattern: "Manage/{controller=Home}/{action=Index}/{id?}");
app.MapAreaControllerRoute(
name: "Account",
areaName: "Account",
pattern: "Account/{controller=Home}/{action=Index}/{id?}");
更改存储视图的默认区域文件夹
以下代码将默认的区域文件夹从 "Areas" 改为"MyAreas":
builder.Services.Configure<RazorViewEngineOptions>(options =>
{
options.AreaViewLocationFormats.Clear();
options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/{1}/{0}.cshtml");
options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/Shared/{0}.cshtml");
options.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
});
相关文章
- Sylvan.Data.Excel 性能优异的开源.NET Excel数据读取库
- ASP.NET Core 中常用的内置中间件
- .NET9 F#有什么新特性?
- .NET 开源 ORM FreeSql 使用教程
- .NET9 C# 13 有哪些新特性?
- .NET9 开始删除内置的 Swagger 支持 可使用Scalar.AspNetCore替代
- .NET 9 中System.Text.Json 的新增功能
- 什么是.NET渐进式Web应用(PWA)
- .NET9在ASP.NET MVC有什么更新?
- .NET开发中常见的异常报错原因和解决方法?
- .NET框架和CLR的工作原理?
- ASP.NET MVC与Web Forms的区别
- .NET C#中的IEnumerable和IEnumerator的区别
- 使用ADO.NET连接到南大通用GBase 8s数据库
- 鸿蒙OpenHarmony系统可以运行跨平台的.NET Core吗?
- ASP.NET Core使用partial标签报错
- .NET 9 即将推出的功能Task.WhenEach
- .NET 使用HttpClientFactory+Polly替代直接使用HttpClient
- .NET Framework被淘汰了吗?
- 强大的 .NET Mock 框架 单元测试模拟库Moq使用教程