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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:34:58