如何定义到多个区域的端点路由

时间:2019-10-12 09:40:55

标签: c# asp.net-mvc asp.net-core-3.0

我试图定义一个MapAreaControllerRoute路由到多个区域,但在3.0中,需要设置areaName:属性。我不明白如何使用一个路线对多个区域有效。

我在这里已经阅读了许多问题,但这似乎对MVC Core 3.0来说是新事物。在MVC Core <= 2.2中,您可以在不定义set AreaName的情况下创建MapRoute。

现在,在Startup.cs中,我将端点定义为:

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapAreaControllerRoute(
                    name: "Area1",
                    areaName: "Area1",
                    pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
                    );

               endpoints.MapAreaControllerRoute(
                    name: "Area2",
                    areaName: "Area2",
                    pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
                    );

                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");


            });

肯定有一种方法可以只定义一条覆盖所有区域的路线吗?

BR 每

2 个答案:

答案 0 :(得分:3)

好吧,因此,在阅读了更多的链接之后,事实证明是区域控制器缺少属性的情况! 通过使用以下标签标记控制器:

[Area("Area1")]
[Route("Area1/[controller]/[action]")]
public class Area1Controller : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

并将路线更改为:

        app.UseEndpoints(endpoints =>
        {
                endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");

            endpoints.MapAreaControllerRoute(
                name: "areas",
                areaName: "areas",
                pattern: "{area}/{controller=Home}/{action=Index}/{id?}"
                );
    }

一切似乎都按预期进行。

答案 1 :(得分:1)

您可以使用MapControllerRoute()为区域编写通用模式:

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "areas",
        pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
    );
    endpoints.MapDefaultControllerRoute();
});

然后,区域控制器仅需要Area属性:

[Area("AreaName")]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}