多租户 Razor 页面

Posted

技术标签:

【中文标题】多租户 Razor 页面【英文标题】:Multi Tenant Razor pages 【发布时间】:2019-06-04 02:55:27 【问题描述】:

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

我的目录结构如下:

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

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

【问题讨论】:

【参考方案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 

...

【讨论】:

以上是关于多租户 Razor 页面的主要内容,如果未能解决你的问题,请参考以下文章

使用 Keycloak 和 SpringBoot 的多租户

1.5 多租户

什么是多租户模式?

多租户和多应用怎么对应

Apache Pulsar 之企业级特性-多租户介绍

什么是多租户saas架构设计