【问题标题】:How to define an endpoint route to multiple areas如何定义到多个区域的端点路由
【发布时间】:2019-10-12 09:40:55
【问题描述】:

我正在尝试定义一个路由到多个区域的MapAreaControllerRoute()。但是,在 ASP.NET Core 3.0 中,需要设置 areaName: 参数,从而将每条路由限制在单个区域。我不明白如何使用适用于多个区域的 one 路线。

我在 Stack Overflow 上阅读了很多问题,但似乎这是 ASP.NET Core 3.0 中的新要求。在 ASP.NET Core MapRoute() 而无需定义集合 areaName

现在,在我的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?}");

});

肯定有办法定义一条覆盖所有区域的单一路线?

【问题讨论】:

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


    【解决方案1】:

    好的,所以在阅读了一堆额外的链接之后,事实证明这是区域控制器缺少属性的情况! 通过使用以下标签标记控制器:

    [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?}"
                    );
        }
    

    一切似乎都按预期工作。

    【讨论】:

    • 不应该先走更复杂的路线吗?我注意到您在原始帖子中这样做了,但是在解决方案中发生了变化。端点路由的文档仍然不完整且未发布,但所有以前的文档都建议使用以前的方法。所以我很好奇你为什么要相反。
    • 我无法理解您的区域路由是如何工作的。 Net Core 3.1 的自动生成代码如下。请注意,名称值应为“areaRoute”。 app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "areaRoute", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); endpoints.MapControllerRoute(名称:“默认”,模式:“{controller=Home}/{action=Index}/{id?}”); });
    • 在我看来,这只是因为 Controller 类上的 Route 属性而起作用,与对 MapAreaControllerRoute() 的调用无关。您是否在 Startup.cs 中没有该块的情况下对其进行了测试?编辑:如果您想创建不特定于某个区域的路线,为什么不直接使用 MapControllerRoute()?
    • @BobbyR。路由的顺序无关紧要,至少在 .NET 5 中是这样。处理所有路由,如果匹配多个路由,则选择最具体的路由。更具体的路由规则在 MSDN 链接docs.microsoft.com/en-us/aspnet/core/fundamentals/…
    • 在我发表评论时,他们仍在为相关发行版本开发文档。可用的文档有一些古怪的信息,让很多人无法弄清楚。他们几个月前发布了这个版本的文档,现在相当简单。
    【解决方案2】:

    您可以使用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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多