如何控制 URL 参数在我的路由 URL 中的位置?

How can I control the placement of URL parameters in my route URL?

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

  1. 一个客户列表,让我可以深入了解...
  2. 给定客户的订单列表,让我可以深入了解...
  3. 客户特定订单的详细信息。

如果我创建几个 Razor 页面,我可能会得到以下结构:

[Pages] Index.cshtml [Customer] Index.cshtml [Order] Index.cshtml

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

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

到目前为止,还不错。 URL 有道理。

现在进入订单详情页面。这需要一个订单号,所以让我们将 @page "{orderNo}" 放在 .cshtml 文件的顶部。它的 URL 是... /Customer/Order/54321。嗯...我丢失了来自 URL 的客户 ID。

我可以通过使 @page 指令包含它 (@page "{customerId}/{orderNo}") 来重新添加客户 ID,但是 URL 是 /Customer/Order/123/54321 - 这不不好看

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

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

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

请注意,这样做的好处是在面对网站结构的变化时保持稳健。例如,您将来可能会决定将 Order 文件夹嵌套在 Customer 文件夹中会妨碍发现,但覆盖路由将确保无论您将源文件移动到 Pages 文件夹中的哪个位置,页面都位于相同的 URL。