Razor Pages为App页面添加路由参数后出现404错误的求助
解决Razor页面添加路由参数后404的问题
嘿,你遇到的问题根源是混淆了Razor页面和MVC控制器的路由机制——你用了MVC控制器专属的[HttpGet]特性来定义路由,但Razor页面有自己的路由规则,根本不识别这个特性,所以才会返回404。下面给你两种靠谱的解决办法:
方法一:直接修改页面的@page指令(推荐)
Razor页面的路由核心是顶部的@page指令,我们可以直接在这个指令里添加路由参数模板,步骤如下:
打开你的
app.cshtml文件,把顶部默认的@page改成带参数的模板:@page "{name}" @model YourProjectName.Pages.appModel如果你想同时保留无参数的访问(比如
http://myapp.com/app也能打开页面),可以把参数设为可选:@page "{name?}"在对应的
app.cshtml.cs页面模型中,保留接收参数的OnGet方法,删掉没用的[HttpGet]特性:public class appModel : PageModel { // 如果是可选参数,要给默认值 public void OnGet(string name = null) { // 在这里使用name参数处理业务逻辑 if (!string.IsNullOrEmpty(name)) { Console.WriteLine($"当前访问的名称:{name}"); } } }
这样修改后,访问http://myapp.com/app/greg就能正常匹配到页面,并且name参数会被正确传递到OnGet方法中。
方法二:全局配置路由约定
如果你不想修改单个页面的@page指令,可以在项目的Program.cs里全局配置Razor页面的路由规则:
var builder = WebApplication.CreateBuilder(args); // 添加Razor页面服务并配置路由约定 builder.Services.AddRazorPages(options => { // 给/app页面添加带参数的路由 options.Conventions.AddPageRoute("/app", "app/{name}"); // 如果要支持无参数访问,改成: // options.Conventions.AddPageRoute("/app", "app/{name?}"); }); var app = builder.Build(); // 中间件配置... app.MapRazorPages(); app.Run();
同样,记得删掉页面模型里的[HttpGet]特性,OnGet方法保持接收name参数即可。
关键注意点
- 一定要删除
[HttpGet("app/{name}")]这个特性,Razor页面不识别它,反而会干扰路由匹配 - 路由模板里的占位符名称(比如
{name})必须和OnGet方法的参数名完全一致 - 如果需要支持无参数访问,要把路由模板里的参数加上
?,同时给方法参数设置默认值
内容的提问来源于stack exchange,提问作者Greg Gum
相关产品推荐
相关产品推荐

