如何将租户/组织 ID 添加到每个 URL 并在控制器中读取它

How to add tenant / organization id to every URL and read it inside controller

我正在编写 ASP.NET 核心 Web 应用程序。在我的应用程序中,用户可以是一个或多个组织的成员(此信息存储在数据库中)。我想让用户有可能 select 整个应用程序应该 运行 的组织环境。此上下文应传递给每个控制器,以便我可以进行适当的检查,并且 return 仅来自 selected 组织的数据。

换句话说,我想实现用户可以通过以下方式访问应用程序时的状态: app.mydomain.com/org1/controller/action/id 并使用下拉菜单,他们应该能够切换到 org2 并访问应用程序。mydomain/org2/controller/action/id

在这两种情况下,我都需要能够读取控制器内部的组织。这应该适用于每个控制器。

这应该怎么做?是否有可能构建一个可以处理它的路由并向每个控制器添加新参数,例如组织编号?或者也许应该有一个服务可以从 URL 读取这些信息并可以注入到控制器中?那么路线会怎样?我已经阅读了一些关于以类似方式处理多种语言的教程(使用 URL 中的文化),但我无法将其转化为我的案例。

关于如何将 select 组织 ID 传递给控制器​​:

查看:

<form action="/Orgnization/Test">
    <select id="select" name="select" asp-items="@ViewBag.Sel"></select>
</form>
@section Scripts
{
<script>
    $(document).ready(function () {

        $("#select").change(function () {
            $('form').submit();
        });
    })
</script>
}

配置select列表:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        //for easy testing,I just set it manually...
        ViewBag.Sel = new List<SelectListItem>() {
            new SelectListItem() { Value = "-1", Text = "--- Select ---" },
            new SelectListItem() { Value = "org1", Text = "org1" },
            new SelectListItem() { Value = "org2", Text = "org2" },
            new SelectListItem() { Value = "org3", Text = "org3" },
        };
        return View();
    }
}

控制器:

public class OrgnizationController : Controller
{
    public IActionResult Test(string select)
    {
        //the select is the value you choose
        //do your stuff....
        return View();
    }
}

如果要在路由中添加前缀并在控制器中获取:

Startup.cs:

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{orgid?}/{controller=Home}/{action=Privacy}/{id?}");
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Privacy}/{id?}");
});

控制器:

public class OrgnizationController : Controller
{
    public IActionResult Test(string select)
    {
        var org = "";
        if (select==null)
        {
            var path = Request.Path.ToString();
            org = path.Split('/')[1];
        }
        //do your stuff....
        return View();
    }
}

结果: