You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core Razor Pages无标识符路由配置:按尾斜杠区分页面

解决Razor Pages中区分末尾带/和不带/的路由问题

要实现你需要的URL规则(带斜杠的URL指向List页面,不带的指向Product页面),可以通过以下步骤配置:

1. 禁用末尾斜杠的自动重定向

默认情况下,ASP.NET Core会自动重定向带末尾斜杠的URL到不带斜杠的版本(反之亦然),这会破坏我们的路由区分逻辑。所以首先在Program.cs中关闭这个行为:

builder.Services.Configure<RouteOptions>(options =>
{
    // 禁止自动重定向带/的URL,保留原始请求格式
    options.SuppressTrailingSlashRedirect = true;
    // 可选:如果旧站URL是小写格式,开启这个统一转小写
    options.LowercaseUrls = true;
});

2. 配置两个页面的路由模板

接下来分别给List和Product页面设置针对性的路由:

List页面(List.cshtml)

使用带末尾斜杠的通配符路由,匹配任意层级且以斜杠结尾的URL:

@page "{*slug}/"
@model YourNamespace.Pages.ListModel

<!-- List页面展示产品列表的内容 -->

这里的{*slug}是通配符路由参数,能捕获任意长度的路径段(比如/category-of-products/、/electronics/phones/),末尾的/是固定字面量,确保只有带斜杠的URL才会匹配这个页面。

你可以在页面模型中通过RouteData获取捕获到的分类路径:

public void OnGet()
{
    var categoryPath = RouteData.Values["slug"] as string;
    // 根据categoryPath加载对应分类的产品列表
}

Product页面(Product.cshtml)

使用不带末尾斜杠的通配符路由,匹配任意层级且不以斜杠结尾的URL:

@page "{*slug}"
@model YourNamespace.Pages.ProductModel

<!-- Product页面展示单个产品详情的内容 -->

这个路由会匹配所有不带末尾斜杠的URL(比如/name-of-product、/electronics/iphone-15)。同样在页面模型中获取产品slug:

public void OnGet()
{
    var productSlug = RouteData.Values["slug"] as string;
    // 根据productSlug加载对应产品的详情数据
}

3. 路由优先级说明

ASP.NET Core的路由系统会优先匹配更具体的模板。因为List页面的路由模板末尾有明确的/字面量,所以当请求带斜杠时,会优先匹配List页面;不带斜杠的请求则会匹配Product页面的模板,不会出现路由冲突。

测试验证

  • 访问http://www.example.com/category-of-products/ → 显示List页面
  • 访问http://www.example.com/name-of-product → 显示Product页面
  • 访问http://www.example.com/electronics/laptops/ → 显示List页面(加载笔记本分类的产品)
  • 访问http://www.example.com/electronics/macbook-pro → 显示Product页面(加载MacBook Pro的详情)

内容的提问来源于stack exchange,提问作者Amb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 18:52:30