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
[页面]
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!这很有效。重复这条路并不十分干燥,面对场地结构的变化,这条路可能相当脆弱,但它是可行的。谢谢(回答这个问题,这样我就可以接受了?)