如何将租户/组织 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();
}
}
结果:
我正在编写 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();
}
}
结果: