Multi Tenant Razor страницы - PullRequest
       41

Multi Tenant Razor страницы

0 голосов
/ 09 января 2019

Я пытаюсь настроить маршрутизацию Razor Pages, чтобы различные виды отображались для разных арендаторов.

У меня есть структура каталогов:

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

Учитывая, что я уже могу решить, какой арендатор требуется, как можно настроить маршрутизацию для сопоставления некоторого пути, например, localhost:8080/Test с Tenant1/Test или Tenant2/Test представлениями.

1 Ответ

0 голосов
/ 09 января 2019

Использовать динамический просмотр контента (через частичные просмотры).

При таком решении страница 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();
    }
}

О частичных видах можно прочитать здесь .

Дополнительно: использование той же модели страницы.
Я также заметил, что вы хотели использовать одну и ту же модель страницы (что означает разделение Test.cshtml.cs для обоих. Это довольно тривиально, но для полноты ответа вот как вы это сделаете ...

/ Страницы / Test.cshtml.cs

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

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

@page
@using Foo.Pages
@model MySharedTestModel 

...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...