ASP.NET Core Razor Pages路由404:多路由匹配配置求助
解决ASP.NET Core Razor Pages多路由匹配问题
你的问题在于原有的@page指令和AddPageRoute配置无法覆盖所有期望的路由场景:/blog/{category?}/page/{pageNo?}这个模板强制要求URL包含/page/段,哪怕参数可选,也无法匹配缺少该段的/blog或/blog/aspnet。同时AddPageRoute的使用方式不对,它是为页面添加备用路由,而非覆盖或补充所有需要的路由规则。
正确配置方式
你需要给Blog页面添加多个路由约定,覆盖四个目标路由场景,同时确保页面模型能正确接收可选参数。
步骤1:调整Blog.cshtml的@page指令
将Blog.cshtml顶部的@page指令改为基础路由,作为默认匹配:
@page "/blog" @model BlogModel
步骤2:在Program.cs中添加额外路由约定
通过AddPageRoute为页面添加另外三个路由模板,覆盖剩余场景:
builder.Services.AddRazorPages().AddRazorPagesOptions(options => { // 匹配 /blog/{category}(仅指定分类,无页码) options.Conventions.AddPageRoute("/Blog", "blog/{category}"); // 匹配 /blog/page/{pageNo}(仅指定页码,无分类) options.Conventions.AddPageRoute("/Blog", "blog/page/{pageNo}"); // 匹配 /blog/{category}/page/{pageNo}(同时指定分类和页码) options.Conventions.AddPageRoute("/Blog", "blog/{category}/page/{pageNo}"); });
步骤3:确保页面模型接收可选参数
在Blog.cshtml.cs中定义对应的可选参数,用于接收路由传递的值:
public class BlogModel : PageModel { public string? Category { get; set; } public int? PageNo { get; set; } public void OnGet(string? category = null, int? pageNo = null) { Category = category; PageNo = pageNo; } }
验证效果
配置完成后,四个目标路由都会正确匹配到Blog页面:
/blog→category为null,pageNo为null/blog/aspnet→category为aspnet,pageNo为null/blog/page/1→category为null,pageNo为1/blog/aspnet/page/1→category为aspnet,pageNo为1
内容的提问来源于stack exchange,提问作者K V Sharma
相关产品推荐
相关产品推荐

