我正在尝试使用 ASP.Net Core v1.1.0 创建 Multi-Tenancy Web 应用程序。单个用户可能属于多个租户(即,负责监督多个商店的区域经理)。用户还应该能够访问该站点并查看一些基本的营销 View ,而无需登录或没有任何租户的访问权限,但是功能将受到极大限制。
从结构上来说,到目前为止,我的项目并没有从默认的 ASP.Net Core MVC 模板发展太多......
在 Startup.cs
中,我按如下方式定义了路由,以尝试使用子域来定义用户尝试登录的商店。 “DEMO”表示用户只能看到营销 View :
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{tenant=DEMO}/{controller=Home}/{action=Index}/{id?}");
});
既然我已经这样做了,变量tenant
就可以神奇地用在像这样的 Controller 操作定义中,而且它工作得很好:
public IActionResult Contact(string tenant)
{
ViewData["Message"] = "Your contact page for " + tenant + ".";
return View();
}
但我使用 _Layout.cshtml
作为包含大部分站点导航和一些个性化元素的包装器,我想做一些事情,例如禁用 DEMO 租户的大部分导航并显示所有其他租户的商店特定 Logo 。据我所知,没有与 _Layout.cshtml
关联的 Controller ,因此我需要一种不同的方式来注入(inject)该字符串。我尝试将以下行添加到 _ViewImports.cshtml
:
@inject System.String tenant
我收到错误InvalidOperationException:没有注册类型“System.String”的服务。
这让我相信我需要向ConfigureServices添加一些内容
> Startup.cs 中的方法,但我不知道我在做什么,也无法在网上找到任何类似的代码示例。我正在想象这样的事情:
services.AddScoped<ITenantFactory, MySeeminglyUnnecessaryFactory>();
但即便如此,我也不知道如何将 tenant
路由参数获取到工厂,或者如何去实现它。如果我能找到一种传入字符串的固定方法,我确信我可以用它来做我需要做的事情,直到改变布局的外观和感觉,并且我觉得限制用户访问非常舒服在 Controller 级别。预先感谢您的任何建议或想法!
最佳答案
您可以使用 View 上下文:
Hello user of @(ViewContext.RouteData.Values["tenant"])!
https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.Razor/RazorPageBase.cs
关于c# - 如何将路由参数注入(inject)_Layout.cshtml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42428526/