【问题标题】:pass querystring to AddPageRoute in Asp.net core razor pages将查询字符串传递给 Asp.net 核心剃须刀页面中的 AddPageRoute
【发布时间】:2021-11-08 18:42:42
【问题描述】:

如何在 Asp.net core razor pages 中将查询字符串传递给 AddPageRoute ?

例如

options.Conventions.AddPageRoute("/WritingList?typeID=1", "Blog");

当我添加 querystring 时,路由不起作用。

我想要这些路线:

  1. domain.com/blog
  2. domain.com/news
  3. domain.com/mobile
  4. domain.com/laptop

数字 1,2 具有相同的结构,因此它们应该被路由到 WritingList 页面。数字 3,4 具有相同的结构,因此它们应该被路由到 ProductList 页面,但我无法访问这些页面中的查询字符串或路由值

【问题讨论】:

  • AddPageRoute 方法的第一个参数是您要为其提供附加路由模式的页面的名称。因此,提供属于 URL 而不是页面名称的查询字符串是没有意义的。如果您能解释为什么要尝试添加新路线,那么有人可能会提出可行的替代方案。

标签: asp.net-core url-routing razor-pages


【解决方案1】:

前两个 URL 的 AddRoutePage 方法是

AddPageRoute("/WritingList", "blog/{val?}");
AddPageRoute("/WritingList", "news/{val?}");

在这些页面中,您可以通过绑定到 PageModel 中名为 Val 的公共属性来获取路由值,并将 SupportsGet 设置为 true:

[BindProperty(SupportsGet=true)]
public int? Val {get;set;}

或者通过引用RouteData.Values["val"]。

如果您更喜欢使用查询字符串,可以省略 URL 中的路由参数:

AddPageRoute("/WritingList", "blog");
AddPageRoute("/WritingList", "news");

然后您可以通过Request.Query访问PageModel中的查询字符串值例如:

var val = Request.Query["val"];

有关路由和绑定请求值的更多信息,请参见此处:

https://www.learnrazorpages.com/razor-pages/routing
https://www.learnrazorpages.com/razor-pages/model-binding#binding-data-from-get-requests

【讨论】:

  • 最终用户只输入 domain.com/blog 或 domain.com/news 没有任何查询字符串,我如何在 WritingList 页面中找到哪个?
  • 你可以使用Request.Path
  • 是的,我目前正在使用 Request.Path ,但它不干净,我必须从路径中提取我想要的部分
【解决方案2】:

使用 AddPageRoute 配置到指定页面路径的页面的路由。生成的页面链接使用您指定的路由。

AddPageRoute 使用 AddPageRouteModelConvention 来建立路由。

例子:

options.Conventions.AddPageRoute("/Contact", "TheContactPage/{text?}");

示例应用为 Contact.cshtml 创建到 /TheContactPage 的路由。他也可以通过默认路由在 /Contact 访问联系人页面。

示例应用到联系人页面的自定义路由允许使用可选的文本路由段 ({text?})。

该页面还在其 @page 指令中包含此可选段,以防访问者通过其 /Contact 路由访问该页面:

@page "{text?}"
@model ContactModel
@{
    ViewData["Title"] = "Contact";
}

<h1>@ViewData["Title"]</h1>
<h2>@Model.Message</h2>

<address>
    One Microsoft Way<br>
    Redmond, WA 98052-6399<br>
    <abbr title="Phone">P:</abbr>
    425.555.0100
</address>

<address>
    <strong>Support:</strong> <a href="mailto:Support@example.com">Support@example.com</a><br>
    <strong>Marketing:</strong> <a href="mailto:Marketing@example.com">Marketing@example.com</a>
</address>

<p>@Model.RouteDataTextTemplateValue</p>

通过普通路由 /Contact 或自定义路由 /TheContactPage 访问联系人页面。

如果您提供额外的文本路由段,页面将显示您提供的 HTML 编码段:

更多用法可以看这篇文章:https://www.learnrazorpages.com/razor-pages/routing

【讨论】:

    猜你喜欢
    • 2019-06-13
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2019-01-19
    相关资源
    最近更新 更多