Asp.net core 如何控制URL参数在路由URL中的位置?

Asp.net core 如何控制URL参数在路由URL中的位置?,asp.net-core,routes,razor-pages,Asp.net Core,Routes,Razor Pages,假设我正在创建一个网站来显示客户订单。我想让页面显示: 一份客户名单,让我可以深入到 给定客户的订单列表,允许我深入到 客户特定订单的详细信息 如果我创建几个Razor页面,我可能会得到以下结构: [页面] Index.cshtml [客户] Index.cshtml [命令] Index.cshtml 顶级页面(客户列表)没有参数,因此其URL只是/ 客户页面(客户的订单列表)需要客户ID,因此我可以将@page“{customerId}放在.cshtml文件的顶部。它的URL将是/cust

假设我正在创建一个网站来显示客户订单。我想让页面显示:

  • 一份客户名单,让我可以深入到
  • 给定客户的订单列表,允许我深入到
  • 客户特定订单的详细信息
  • 如果我创建几个Razor页面,我可能会得到以下结构:

    [页面]
    Index.cshtml
    [客户]
    Index.cshtml
    [命令]
    Index.cshtml
    

    顶级页面(客户列表)没有参数,因此其URL只是
    /

    客户页面(客户的订单列表)需要客户ID,因此我可以将
    @page“{customerId}
    放在.cshtml文件的顶部。它的URL将是
    /customer/123

    到目前为止,一切都很好。这个URL很有意义


    现在是订单详细信息页面。这需要一个订单号,所以让我们把
    @page“{orderNo}”
    放在.cshtml文件的顶部。它的URL是…
    /Customer/order/54321
    .Hmmm…我从URL中丢失了客户ID

    我可以通过使
    @page
    指令包含客户ID(
    @page“{customerId}/{orderNo}”
    ),将客户ID添加回,但是URL是
    /customer/Order/123/54321
    ,看起来不太好

    如何使URL看起来像
    /Customer/123/Order/54321

    您可以使用来否定框架生成的基于路径的路由。覆盖路由从前导的
    /
    开始。在您的示例中,解决方案是:

    @page "/Customer/{customerid}/Order/{orderid}"
    

    请注意,这样做的好处是在面对站点结构的更改时保持健壮。例如,您将来可能会决定将订单文件夹嵌套在客户文件夹中会妨碍查找,但覆盖路由将确保在相同的URL上查找页面,而不管您将源文件移动到其中的何处页面文件夹。

    “我从URL中丢失了客户ID。“你需要吗?你肯定只需要订单号吗?或者你会在客户之间复制订单号?@MikeBrind:事实上,这根本不是客户和订单,但假设订单号是每个客户的序列号,因此订单号本身并不能识别客户。:-)Orders文件夹中索引页的路由模板将是
    “/Customer/{customerid}/Order/{orderid}”
    。请注意前导的
    /
    。它覆盖了基于路径的路由:。@MikeBrind:Ha!这很有效。重复这条路并不十分干燥,面对场地结构的变化,这条路可能相当脆弱,但它是可行的。谢谢(回答这个问题,这样我就可以接受了?)