You need to enable JavaScript to run this app. ASP.NET Core Razor Pages 实现URL页面名后全路径传入OnGet方法
优惠活动
大模型
产品
解决方案
定价
更多

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。

验证可行的落地步骤

  1. 移除Startup.cs里新增的endpoints.MapControllerRoute()相关配置,仅保留默认的endpoints.MapRazorPages();即可,不需要额外配置全局路由
  2. 保留页面后置代码Static.cshtml.cs中的动作定义:public IActionResult OnGet(string viewPath),方法参数名和路由捕获参数名保持一致
  3. 打开对应的页面视图文件Static.cshtml,在文件头部的@page指令后追加全捕获路由声明,修改为:
@page "{*viewPath}"

该配置为单个Razor Page绑定catch-all全捕获路由,可匹配/Reports/Static路径下任意多层级的后缀内容,自动将捕获的路径值映射到OnGet方法的viewPath参数,完全兼容原MVC项目的传参逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 13:36:03