You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7中Razor Pages路由添加环境参数的配置问题

解决.NET 7 Razor Pages带环境前缀的路由404问题

核心思路

要让/[environment]/pool/[id]这种路由能命中pool.cshtml页面,得通过AddRazorPagesOptions给所有Razor Pages加全局路由前缀,同时保留页面本身的参数路由规则。

具体操作步骤

1. 配置全局路由前缀

在Program.cs里,给Razor Pages添加全局路由约定,把环境段作为前缀:

builder.Services.AddRazorPages(options =>
{
    // 给所有页面路由加上{environment}前缀
    options.Conventions.AddFolderRouteModelConvention("/", model =>
    {
        foreach (var selector in model.Selectors)
        {
            var originalTemplate = selector.AttributeRouteModel.Template;
            selector.AttributeRouteModel.Template = "{environment}/" + originalTemplate;
        }
    });
});

2. 调整中间件顺序

你的环境提取中间件必须放在路由中间件前面,这样才能先解析出环境信息,再让路由系统处理匹配:

// 先跑环境提取中间件
app.UseMiddleware<EnvironmentExtractionMiddleware>();

// 再启动路由中间件
app.UseRouting();

app.MapRazorPages();

3. 给Pool页面指定精确路由(可选)

如果想更精准控制pool.cshtml的路由,可以直接在页面模型上标注路由模板:

[PageRoute("/{environment}/pool/{id:int}")]
public class PoolModel : PageModel
{
    public void OnGet(int id)
    {
        // 从路由值里拿环境名称
        var envName = HttpContext.Request.RouteValues["environment"]?.ToString();
        // 后续业务逻辑
    }
}

4. 设置默认环境(可选)

如果需要支持不带环境前缀的默认访问(比如默认用development),可以在路由模板里加默认值:

options.Conventions.AddFolderRouteModelConvention("/", model =>
{
    foreach (var selector in model.Selectors)
    {
        var originalTemplate = selector.AttributeRouteModel.Template;
        // 给environment参数加默认值development
        selector.AttributeRouteModel.Template = "{environment=development}/" + originalTemplate;
    }
});

注意事项

  • 确保路由里的{environment}和中间件提取的环境名称大小写一致,避免匹配失败
  • 测试时直接访问https://localhost/development/pool/123,检查路由值是否能正确传递到页面模型
  • 如果某些页面不需要环境前缀,可以单独给这些页面排除全局约定

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:10:12