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

.NET 7 Razor页面如何配置全局动态路由前缀?

.NET 7 Razor 应用全局动态路由前缀实现方案

实现思路

通过自定义路由约定或直接配置路由模板,给所有Razor页面添加{siteName}动态前缀,同时将该参数存入路由数据,实现入站路由到实际页面路径的映射。

具体实现步骤

1. 配置全局路由约定

在Program.cs中,给Razor页面添加全局路由规则,为所有页面路径加上{siteName}前缀:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages(options =>
{
    // 为根目录下所有页面添加路由前缀约定
    options.Conventions.AddFolderRouteModelConvention("/", model =>
    {
        foreach (var selector in model.Selectors)
        {
            var originalTemplate = selector.AttributeRouteModel.Template;
            // 修改路由模板,拼接{siteName}前缀和通配符匹配
            selector.AttributeRouteModel.Template = 
                string.IsNullOrEmpty(originalTemplate) 
                    ? "{siteName}/{*page}" 
                    : "{siteName}/{*page}/" + originalTemplate;
        }
    });
});

var app = builder.Build();

// 常规中间件配置
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();

app.MapRazorPages();

app.Run();

2. 获取路由数据中的siteName

在任意Razor页面的代码逻辑或视图中,可直接从RouteData读取siteName参数:

// 在页面模型类(.cshtml.cs)中
public string CurrentSiteName => RouteData.Values["siteName"]?.ToString() ?? "";

// 在视图(.cshtml)中直接使用
<p>当前站点标识: @RouteData.Values["siteName"]</p>

3. 简化路由配置(单规则匹配)

如果不需要复杂的目录约定,也可以直接通过MapFallbackToPage实现单路由规则覆盖所有页面:

// 替换原有的app.MapRazorPages()
app.MapRazorPages()
   .MapFallbackToPage("/{siteName}/{*page}", "/{page}");

注:这里的/{page}会自动匹配Pages目录下对应的页面文件,比如/home对应/Pages/home.cshtml,根路径对应/Pages/Index.cshtml

关键说明

  • 路由中的{*page}是通配符参数,会匹配siteName之后的所有路径和查询字符串,确保所有子页面、嵌套目录页面都能被正确映射
  • 访问http://somesite.com/site1/products/list?id=1时,siteName为site1,page为products/list,最终映射到/Pages/products/list.cshtml,同时查询字符串id=1会被保留

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:35:07