如何将路由参数注入_Layout.cshtml

时间:2017-02-24 00:05:59

标签: c# asp.net-mvc razor asp.net-core asp.net-core-mvc

我正在尝试使用ASP.Net Core v1.1.0创建多租户Web应用程序。单个用户可能属于多个租户(即 - 监督多个商店的区域经理。)用户还应该能够访问该站点并查看一些基本的营销视图,而无需登录或拥有任何租户的访问权限,但是功能将受到很大限制。

从结构上讲,到目前为止,我的项目还没有从默认的ASP.Net Core MVC模板发展出来......

Startup.cs中,我已按如下方式定义路由,以尝试使用子域来定义用户尝试登录的存储。 “DEMO”表示用户应该只看到营销视图:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{tenant=DEMO}/{controller=Home}/{action=Index}/{id?}");
});

由于我已经这样做了,变量tenant可以在这样的控制器动作定义中神奇地使用,并且它可以正常工作:

public IActionResult Contact(string tenant)
{
    ViewData["Message"] = "Your contact page for " + tenant + ".";

    return View();
}

但我使用_Layout.cshtml作为包含大部分网站导航和一些个性化元素的包装器,我想做的事情就是禁用DEMO租户的大部分导航并显示商店特定的徽标对于所有其他租户。因为据我所知,没有与_Layout.cshtml相关联的控制器,我需要一种不同的方式来注入这个字符串。我尝试将以下行添加到_ViewImports.cshtml

@inject System.String tenant

我收到错误InvalidOperationException: No service for type 'System.String' has been registered.这让我相信我需要在ConfigureServices中向Startup.cs方法添加内容,但我不知道我在做什么并且无法在线找到任何类似的代码示例。我想象这样的东西:

services.AddScoped<ITenantFactory, MySeeminglyUnnecessaryFactory>();

但即便如此,我不知道如何将tenant路由参数提供给工厂,或者如何实现它。如果我能找到一个传入字符串的罐装方法,我确信我可以使用它来做我需要做的事情,只要改变布局的外观和感觉,我觉得很容易限制用户访问在控制器级别。提前感谢任何建议或想法!

1 个答案:

答案 0 :(得分:2)

只需使用查看上下文:

template <class... Ts>
void foo(std::tuple<Ts...> t) {
    std::apply([](auto&... args) {
        (std::cout << ... << args);
    }, t);
}

源: https://github.com/aspnet/Mvc/blob/19331f95326b18bd6f0400526074da934bf65cf0/test/WebSites/RazorPagesWebSite/HelloWorldWithRoute.cshtml

https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.Razor/RazorPageBase.cs