如何在 .NET Core 3.x 中配置多个区域

mgs*_*dew 1 c# area asp.net-core .net-core-3.1

我的项目中有多个区域。将项目从 .NET Core 2.2 升级到 3.1 后,这些区域无法工作/调用。

我在区域内的控制器看起来像:-

[Area(nameof(CRM))]
[Authorize]
[ServiceFilter(typeof(ActionFilter))]
public class DefaultController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

之前处理多个区域的配置如下所示: -

   routes.MapRoute(name: "Area", template: "{area:exists}/{controller=Default}/{action=Index}/{id?}");
   routes.MapRoute(name: "Area Default Create", template: "{area:exists}/{controller=Default}/create", defaults: new { action = "CreateOrEdit" });
   routes.MapRoute(name: "Area Default Edit", template: "{area:exists}/{controller=Default}/edit/{id}", defaults: new { action = "CreateOrEdit" });
Run Code Online (Sandbox Code Playgroud)

因为我们必须在 .NET Core 3.1 中使用UseEndpoints并且处理多区域的新配置如下[我尝试过的]

参考#端点路由.net core 3-Multiple Areas & https://aregcode.com/blog/2019/dotnetcore-understanding-aspnet-endpoint-routing/

endpoints.MapControllerRoute(name: "areas", pattern: "{area}/{controller}/{action=Index}/{id?}");
Run Code Online (Sandbox Code Playgroud)

但是,它不起作用也尝试通过以下方式调用并且不成功:-

endpoints.MapAreaControllerRoute(name: "Area", areaName: "areas", pattern: "{area:exists}/{controller=Default}/{action=Index}/{id?}");
endpoints.MapAreaControllerRoute(name: "Area Default Create", areaName: "areas", pattern: "{area:exists}/{controller=Default}/create", defaults: new { action = "CreateOrEdit" });
endpoints.MapAreaControllerRoute(name: "Area Default Edit", areaName: "areas", pattern: "{area:exists}/{controller=Default}/edit/{id}", defaults: new { action = "CreateOrEdit" });
Run Code Online (Sandbox Code Playgroud)

即使它也不适用于单个区域

参考# https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.1&tabs=visual-studio

endpoints.MapAreaControllerRoute(name: "Area", areaName: "CRM", pattern: "CRM/{controller=Default}/{action=Index}/{id?}");
Run Code Online (Sandbox Code Playgroud)

mgs*_*dew 6

我只是自己解决了这个问题,这是克服这种情况的解决方案:-

在 Startup.cs 类中添加以下行以处理多个区域的动态路由

endpoints.MapAreaControllerRoute(name: "areas", "areas", pattern: "{area:exists}/{controller=Default}/{action=Index}/{id?}");  
Run Code Online (Sandbox Code Playgroud)

这里地区是您的区域文件夹 [默认] 的名称。您可以根据需要更改它。

更改控制器的标题标记如下: -

[Area(nameof(CRM))]  // CRM is the another-folder name inside Areas folder
[Route("CRM/[controller]/[action]")]
[Authorize]
[ServiceFilter(typeof(ActionFilter))]
public class DefaultController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

最后更改您的 Razor 标记如下所示,以在区域文件夹的控制器中调用您的目标操作

<a asp-area="CRM" asp-controller="Default" asp-action="Index">Home of CRM</a>
Run Code Online (Sandbox Code Playgroud)