如何在 .NET Core 中配置多个区域 3.x
How to Configure Multiple Area in .NET Core 3.x
我的项目中有多个区域。将项目形式从 .NET Core 2.2 升级到 3.1 后,这些区域不是 work/call。
Area 中我的控制器看起来像:-
[Area(nameof(CRM))]
[Authorize]
[ServiceFilter(typeof(ActionFilter))]
public class DefaultController : Controller
{
public IActionResult Index()
{
return View();
}
}
之前处理多个区域的配置如下所示:-
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" });
因为我们必须在 .NET Core 3.1 中使用 UseEndpoints 并且处理多区域的新配置如下所示 [我尝试了什么]
参考# & https://aregcode.com/blog/2019/dotnetcore-understanding-aspnet-endpoint-routing/
endpoints.MapControllerRoute(name: "areas", pattern: "{area}/{controller}/{action=Index}/{id?}");
但是,它不起作用也尝试通过以下方式调用但不成功:-
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" });
即使它对个别区域也不起作用
endpoints.MapAreaControllerRoute(name: "Area", areaName: "CRM", pattern: "CRM/{controller=Default}/{action=Index}/{id?}");
我只是自己解决了这个问题,这里是克服这种情况的解决方案:-
在 Startup.cs class 中添加以下行以处理多个 Areas
的动态路线
endpoints.MapAreaControllerRoute(name: "areas", "areas", pattern: "{area:exists}/{controller=Default}/{action=Index}/{id?}");
此处 areas 是您的区域文件夹的名称 [默认]。您可以根据自己的意愿进行更改。
更改控制器的 header 标记如下:-
[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();
}
}
最后像下面这样更改你的 Razor 标记,以在 Areas 文件夹的 Controller 中调用你的目标 Action
<a asp-area="CRM" asp-controller="Default" asp-action="Index">Home of CRM</a>
我的项目中有多个区域。将项目形式从 .NET Core 2.2 升级到 3.1 后,这些区域不是 work/call。
Area 中我的控制器看起来像:-
[Area(nameof(CRM))]
[Authorize]
[ServiceFilter(typeof(ActionFilter))]
public class DefaultController : Controller
{
public IActionResult Index()
{
return View();
}
}
之前处理多个区域的配置如下所示:-
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" });
因为我们必须在 .NET Core 3.1 中使用 UseEndpoints 并且处理多区域的新配置如下所示 [我尝试了什么]
参考#
endpoints.MapControllerRoute(name: "areas", pattern: "{area}/{controller}/{action=Index}/{id?}");
但是,它不起作用也尝试通过以下方式调用但不成功:-
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" });
即使它对个别区域也不起作用
endpoints.MapAreaControllerRoute(name: "Area", areaName: "CRM", pattern: "CRM/{controller=Default}/{action=Index}/{id?}");
我只是自己解决了这个问题,这里是克服这种情况的解决方案:-
在 Startup.cs class 中添加以下行以处理多个 Areas
的动态路线endpoints.MapAreaControllerRoute(name: "areas", "areas", pattern: "{area:exists}/{controller=Default}/{action=Index}/{id?}");
此处 areas 是您的区域文件夹的名称 [默认]。您可以根据自己的意愿进行更改。
更改控制器的 header 标记如下:-
[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();
}
}
最后像下面这样更改你的 Razor 标记,以在 Areas 文件夹的 Controller 中调用你的目标 Action
<a asp-area="CRM" asp-controller="Default" asp-action="Index">Home of CRM</a>