如何在ASP.NET Core Razor Pages路由中添加前置动态租户ID
实现ASP.NET Core 7租户ID前置的URL路由格式
1. 配置全局路由前缀
在Program.cs中,修改控制器或Razor页面的路由配置,将{tenantId}设为全局路由前缀:
针对MVC控制器
builder.Services.AddControllersWithViews(); var app = builder.Build(); // 其他中间件(如静态文件、认证授权)配置... app.UseRouting(); app.MapControllerRoute( name: "default", pattern: "{tenantId}/{controller=Home}/{action=Index}/{id?}");
针对Razor页面
builder.Services.AddRazorPages(); var app = builder.Build(); // 其他中间件配置... app.UseRouting(); app.MapRazorPages() .AddRazorPagesOptions(options => { options.Conventions.AddFolderRouteModelConvention("/", model => { foreach (var selector in model.Selectors) { var attributeRouteModel = selector.AttributeRouteModel; attributeRouteModel.Template = AttributeRouteModel.CombineTemplates("{tenantId}", attributeRouteModel.Template); } }); });
2. 在控制器/页面中接收TenantId参数
MVC控制器
可以直接在Action方法中接收tenantId参数,或通过RouteData获取:
public class ReportIssueController : Controller { // 直接作为方法参数接收 public IActionResult Index(string tenantId) { // 业务逻辑中使用tenantId return View(); } // 从RouteData中读取 public IActionResult Detail() { var tenantId = RouteData.Values["tenantId"]?.ToString(); // 业务逻辑处理 return View(); } }
Razor页面
在@page指令中保留路由参数,或直接从RouteData获取:
@page "{tenantId}/ReportIssue" @model ReportIssueModel @{ var tenantId = RouteData.Values["tenantId"]?.ToString(); } <!-- 页面内容 -->
如果已经配置了全局路由前缀,@page可简化为@page "ReportIssue",前缀会自动包含{tenantId}。
3. 生成包含租户ID的URL
在视图或页面中生成链接时,需传入tenantId参数:
MVC视图
<a asp-controller="ReportIssue" asp-action="Index" asp-route-tenantId="@ViewBag.TenantId">提交问题</a>
Razor页面
<a asp-page="/ReportIssue" asp-route-tenantId="@Model.TenantId">提交问题</a>
后台代码中生成URL:
// MVC控制器中 var url = Url.Action("Index", "ReportIssue", new { tenantId = "6ee0558e-f783-4d6d-8bf9-b439835b3ad8" }); // Razor页面中 var url = Url.Page("/ReportIssue", new { tenantId = "6ee0558e-f783-4d6d-8bf9-b439835b3ad8" });
4. 可选:租户ID验证中间件
添加中间件验证tenantId合法性,拦截非法请求:
app.Use(async (context, next) => { if (context.Request.RouteValues.TryGetValue("tenantId", out var tenantIdObj)) { var tenantId = tenantIdObj.ToString(); // 替换为实际的租户验证逻辑(如数据库查询) bool isValidTenant = CheckTenantExists(tenantId); if (!isValidTenant) { context.Response.StatusCode = StatusCodes.Status404NotFound; await context.Response.WriteAsync("无效的租户ID"); return; } } await next(); }); // 此中间件需放在UseRouting之后、UseAuthorization之前
内容的提问来源于stack exchange,提问作者WayneRoseberry
相关产品推荐
相关产品推荐

