我的项目中有多个Areas。将项目形式从.NET Core 2.2升级到3.1后,这些区域将无法使用/调用。
我的控制器在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,所以用于处理多区域的新配置就像下面的[我尝试过的内容]
参考#Endpoint Routing .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?}");
但是,它不起作用,也尝试通过以下方式致电,但未成功:-
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类中,添加以下行以处理多个Areas >>]的动态路由endpoints.MapAreaControllerRoute(name: "areas", "areas", pattern: "{area:exists}/{controller=Default}/{action=Index}/{id?}");
这里areas
是Areas文件夹的名称[默认]。您可以根据需要更改它。如下更改控制器的标题标记:-
[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 Controllers文件夹内调用目标Action
<a asp-area="CRM" asp-controller="Default" asp-action="Index">Home of CRM</a>