首页 > 解决方案 > Razor Pages 路由仅使用一个参数,而不是两个

问题描述

我有一个显示杂货的 ASP.NET Core 3.1 Razor Pages 网站。有一个名为 Shop 的区域,其中包含一个名为 Product.cshtml 的 Razor 页面。此页面中没有任何路由设置,只是简单的@page指令,没有其他内容。

页面中的OnGet方法有几个参数,包括两个字符串参数namedcategorysection...

public async Task<IActionResult> OnGet(string currentFilter,
                                       string section,
                                       string category,
                                       string searchAreaID,
                                       string so, int ps, int p = 1)

如果我浏览/Shop/Product?category=Bakery/Shop/Product?category=Bakery&section=Bread一切正常。

我想做的是使用类似/Shop/Product/Bakeryand的 URL /Shop/Product/Bakery/Bread

Startup.cs我添加了如下路线...

.AddRazorPagesOptions(options => {
  options.Conventions.AddAreaPageRoute("Shop", "/Product", "/Shop/Product/{category}/{section}");
  options.Conventions.AddAreaPageRoute("Shop", "/Product", "/Shop/Product/{category}");
  // other routes set here (none relating to the above)
})

这允许我使用上面显示的 URL 进行浏览,但是当我使用标签助手生成链接时,URL 并不总是正确显示。例如,我有以下标记,它生成一组父/子<ul>s,它们用 CSS 标记(为清楚起见省略)...

<ul>
  @foreach (Category category in Model.Categories) {
    <li>
      <a asp-area="Shop"
         asp-page="/Product" 
         asp-route-category="@category.Name">@category.Name</a>
      <ul>
        <li>
          <ul>
            @foreach (Section sub in category.Sections) {
              <li><a asp-area="Shop"
                 asp-page="/Product"
                 asp-route-category="@category.Name" 
                 asp-route-section="@sub.Name">@sub.Name</a></li>
            }
          </ul>
        </li>
      </ul>
    </li>
  }
</ul>

顶级链接中的URL是正确的,形式为/Shop/Product/Bakery,但二级链接没有使用路由中的部分名称,而是将它们添加到查询字符串中,例如/Shop/Product/Bakery?section=Bread

有人知道我在这里做错了什么吗?请让我知道是否还有其他需要包含的内容。

标签: c#asp.net-mvcasp.net-coreasp.net-mvc-routingrazor-pages

解决方案


您可以像这样设置页面路由:

.AddRazorPagesOptions(options => {
    options.Conventions.AddAreaPageRoute("Shop", "/Product", "/Shop/Product/{category?}/{section?}");
});

生成网址

在此处输入图像描述


推荐阅读