多租户剃须刀页面

时间:2019-01-09 10:46:21

标签: asp.net-mvc razor .net-core razor-pages

我正在尝试设置Razor页面路由,以允许为不同的租户呈现不同的视图。

我的目录结构如下:

/Pages
    Test.cshtml.cs
    /Tenant1
        Test.cshtml
    /Tenant2
        Test.cshtml

鉴于我已经能够决定需要哪个租户,如何配置路由以将某些路径(例如localhost:8080/Test映射到Tenant1/TestTenant2/Test视图。

1 个答案:

答案 0 :(得分:1)

使用动态视图内容(通过局部视图)。

使用此解决方案,Test页将根据调用该视图的路线来动态加载其他视图。

这意味着您只有一个Test页,但是在cshtml文件中,您将从局部视图中抓取内容(稍后会详细介绍)。

首先,您需要像这样重命名文件。...

/Pages
    Test.cshtml.cs
    /Tenant1
        _Test.cshtml  // note it is prefixed with an underscore!
    /Tenant2
        _Test.cshtml  // prefixed with an underscore too.
  

部分视图的命名约定是在文件前加下划线(_)。这将立即识别出正在将您的项目文件视为“不可路由”页面的人。

然后,您需要添加一些逻辑以呈现局部视图...

Test.cshtml

@{
    switch(...)  // used a switch statement to illustrate the solution
    {
        case "Tenant1":
            await Html.PartialAsync("~/Pages/Tenant1/_Test.cshtml");
            break;
        case "Tenant2":
            await Html.PartialAsync("~/Pages/Tenant2/_Test.cshtml");
            break;
        default:
            throw new NotImplementedException();
    }
}

您可以阅读有关部分视图here的信息。

其他:使用相同的页面模型。
我还注意到,您曾经想使用相同的页面模型(这意味着两者都共享Test.cshtml.cs。这相当简单,但是为了完整起见,这里是您将如何做的...

/Pages/Test.cshtml.cs

namespace Foo.Pages
{
    public class MySharedTestModel : PageModel
    {
        ...
    }
}

/Pages/Tenant1/Test.cshtml /Pages/Tenant2/Test.cshtml

@page
@using Foo.Pages
@model MySharedTestModel 

...