我正在尝试设置Razor Pages路由,以允许为不同的租户呈现不同的视图.
我有一个目录结构如下:
/Pages
Test.cshtml.cs
/Tenant1
Test.cshtml
/Tenant2
Test.cshtml
鉴于我已经能够确定需要哪个租户,如何配置路由以将一些路径(例如localhost:8080 / Test)映射到Tenant1 / Test或Tenant2 / Test视图.
最佳答案 使用动态视图内容(通过部分视图).
使用此解决方案,“测试”页面将根据用于调用它的路由动态加载不同的视图.
这意味着您只有一个测试页面,但在cshtml文件中,您将从局部视图中获取内容(更多内容在一秒内).
首先,你需要重命名这些文件….
/Pages
Test.cshtml.cs
/Tenant1
_Test.cshtml // note it is prefixed with an underscore!
/Tenant2
_Test.cshtml // prefixed with an underscore too.
The naming convention for a partial view is to prefix the file with an underscore (
_
). This will immediately identify to someone looking at your project files as a “non-routable” page.
然后你添加一些逻辑来渲染局部视图……
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
...