ASP.NET Core Razor Pages 实现URL页面名后全路径传入OnGet方法
Razor Pages 通配路径路由404问题适配方案
当前遇到的运行问题
- 预期效果:访问
HTTP://application.tld/Reports/Static/任意/多层/路径时,由Static.cshtml.cs页面的OnGet(string viewPath)动作处理请求,将页面名称之后的所有路径后缀作为viewPath参数传入方法 - 实际效果:程序会按照物理路径规则去定位
/Reports/Static/任意/多层/路径对应的cshtml文件,因文件不存在直接返回404
项目依赖版本
- Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 5.0.3
- Microsoft.AspNetCore.Session 2.2.0
- Microsoft.EntityFrameworkCore 5.0.3
原有MVC项目的路由参考逻辑
原MVC项目通过全局通配路由规则实现路径捕获:
app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); // 捕获Explorer/之后带斜杠的任意路径内容,自动传给控制器动作参数 routes.MapRoute( name: "Explorer", template: "Explorer/{*path}", defaults: new { controller = "Explorer", action = "Index" }); });
对应控制器动作定义为public IActionResult Index(string path),可自动接收捕获的路径值。
之前尝试的无效配置
转Razor Pages后,曾在Startup.cs的端点配置中新增全局路由规则:
app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); endpoints.MapControllerRoute( name: "static", pattern: "/Reports/Static/{*viewPath}", defaults: new { page = "/Reports/Static", action = "OnGet" }); });
因Razor Pages自带的路径解析优先级高于额外配置的控制器路由,该规则不生效,依然触发404。
验证可行的落地步骤
- 移除Startup.cs里新增的
endpoints.MapControllerRoute()相关配置,仅保留默认的endpoints.MapRazorPages();即可,不需要额外配置全局路由 - 保留页面后置代码
Static.cshtml.cs中的动作定义:public IActionResult OnGet(string viewPath),方法参数名和路由捕获参数名保持一致 - 打开对应的页面视图文件
Static.cshtml,在文件头部的@page指令后追加全捕获路由声明,修改为:
@page "{*viewPath}"
该配置为单个Razor Page绑定catch-all全捕获路由,可匹配/Reports/Static路径下任意多层级的后缀内容,自动将捕获的路径值映射到OnGet方法的viewPath参数,完全兼容原MVC项目的传参逻辑。
内容的提问来源于stack exchange,提问作者Becca
相关产品推荐
相关产品推荐

