.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
相关产品推荐
相关产品推荐

