.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
相关产品推荐
相关产品推荐

