首页 > 解决方案 > 多个常规路线顺序优先顺序未按预期工作(当前 LTS 版本 ASP.NET CORE 3.1)

问题描述

这个问题与 ASP.NET Core 路由有关。我正在做 Concept Multiple Conventional Routes 的动手实现(ASP.NET CORE 3.1 LTS)。 MS 文档MultipleConventional Routes

根据文档,传统路由是依赖于顺序的。这意味着没有正确订购我的路线会产生后果。

这是 app.UseEndpoint 方法的代码片段,其中包含已配置路由的列表。

   app.UseEndpoints(endpoints =>
        {        

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

            endpoints.MapControllerRoute(
                name: "CustomerHomepage",
                defaults:new { controller = "Customer", action = "Index" },
                pattern: "customer/{name}/index"); });

对于这个请求 https://localhost:44341/customer/sean/details

首先看一下路线模板和顺序,尤其是第一条路线,它是完美匹配的

控制器名称 = 客户

动作名称 = 肖恩

id = 详细信息。

我在项目中有什么。

问题 我要说明的一点是,这条路径customer/sean/details总体上应该是无效的,并且不应该根据路由模板的顺序导航到任何地方。相反,它确实导航到客户控制器中的操作方法 Details。问题是为什么它正在工作,而不是基于传统路由依赖于订单的概念,并且此请求 URL customer/sean/details 与第一条路由匹配。此外,关于传统路由依赖于顺序的说法,最好的例子是什么。

下面列出了客户控制器的代码

public class CustomerController: Controller
{
    public IActionResult Index(string name)
    {
        
        return View();
    }

    public IActionResult Details(string name) {

        ViewBag.CustomerName = name;
        return View();
    }
}

标签: asp.net-coreasp.net-core-mvcasp.net-core-3.1

解决方案


ASP.NET Core 3.x+ 中基于约定的路由从根本上不是基于顺序的。相反,路由系统构建一个非循环图,用于将传入 URL 与最佳路由匹配。在您的示例中,文字匹配customer使发送路由成为最佳匹配。

本系列中,我将介绍如何可视化 ASP.NET Core 应用程序中的所有路由,这可能有助于您了解路由的组合方式。

在此处输入图像描述


推荐阅读