多租户 Razor 页面

K.A*_*moa 7 asp.net-mvc razor .net-core razor-pages

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

我有一个目录结构如下:

/Pages
    Test.cshtml.cs
    /Tenant1
        Test.cshtml
    /Tenant2
        Test.cshtml
Run Code Online (Sandbox Code Playgroud)

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

Sve*_*vek 2

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

使用此解决方案,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.
Run Code Online (Sandbox Code Playgroud)

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

然后添加一点逻辑来渲染部分视图......

测试.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();
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关部分视图的信息。

额外:使用相同的页面模型。
我还注意到您想要使用相同的页面模型(意味着Test.cshtml.cs两者共享。这是相当微不足道的,但为了答案的完整性,这里是您将如何做到这一点......

/Pages/Test.cshtml.cs

namespace Foo.Pages
{
    public class MySharedTestModel : PageModel
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@page
@using Foo.Pages
@model MySharedTestModel 

...
Run Code Online (Sandbox Code Playgroud)