【问题标题】:Razor Pages routing only working with one parameter, not twoRazor Pages 路由仅使用一个参数,而不是两个
【发布时间】:2020-11-19 18:33:26
【问题描述】:

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

页面中的OnGet方法有几个参数,包括两个字符串参数,分别命名为categorysection...

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&amp;section=Bread 一切正常。

我想做的是改用/Shop/Product/Bakery/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 并不总是正确显示。例如,我有以下标记生成&lt;ul&gt;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-mvc asp.net-core asp.net-mvc-routing razor-pages


    【解决方案1】:

    你可以这样设置页面路由:

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

    生成网址

    【讨论】:

    • 感谢您的建议,但它仍在生成像 /Shop/Product/Bakery?section=Bread 这样的 URL,而不是 /Shop/Product/Bakery/Bread
    • 你删除了这行options.Conventions.AddAreaPageRoute("Shop", "/Product", "/Shop/Product/{category}");。它只能与上述配置一起使用。你可以看看我的截图。
    • 不,我没有。我认为它按顺序查看路线,并匹配它找到的第一个,因此如果第一个匹配,则不会使用第二个。取出第二条线有效,但我仍然不确定为什么。请您在答案中添加更多解释,我会接受。再次感谢
    • 嗨@AvrohomYisroel,是的,它是按顺序排列的,但顺序是相反的。它首先看最后一个,如果不匹配,则向上看。你可以在底部options.Conventions.AddAreaPageRoute("Shop", "/Product", "/Shop/Product");添加另一个路由,然后两个路由参数都变成查询字符串。
    猜你喜欢
    • 2018-07-07
    • 2019-03-25
    • 2018-12-05
    • 2021-09-19
    • 2018-07-18
    • 2022-01-07
    • 2020-10-23
    • 1970-01-01
    • 2019-07-05
    相关资源
    最近更新 更多