雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

ASP.NET Core MVC 添加Area和Route配置

2024-10-13 19

什么是区域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");
});


更新于:5天前
赞一波!

文章评论

评论问答