web-dev-qa-db-ja.com

.NET Core3.xで複数の領域を構成する方法

プロジェクトに複数のエリアがあります。プロジェクトフォーム.NETCore 2.2を3.1にアップグレードした後、これらの領域は機能しません。

エリア内の私のコントローラーは次のようになります:-

[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を使用する必要があり、複数領域を処理するための新しい構成は次のようになります[私が試したもの]

ReferenceEndpoint Routing .net core 3-Multiple Areashttps://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" });

個々のエリアでも機能していません

参照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?}");
1
mgsdew

私は自分で問題を解決するだけで、この状況を克服するための解決策は次のとおりです。

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マークアップを変更して、Controller ofAreasフォルダー内のターゲットアクションを呼び出します。

<a asp-area="CRM" asp-controller="Default" asp-action="Index">Home of CRM</a>
5
mgsdew