Как настроить маршруты с подобластями в приложении .NET Core 2.1 с помощью Razor Pages? - PullRequest
0 голосов
/ 12 марта 2019

У меня есть существующее веб-приложение ASP.NET Core 2.1, которое использует Razor Pages. Целевая аудитория приложения должна быть расширена для обслуживания взаимоисключающей группы с точки зрения внешнего интерфейса; это один и тот же бэкэнд, другой фронтэнд.

Для краткого обзора результатов ниже приведено желаемое конечное состояние вместе с некоторыми примерами маршрутов:

Areas
    Student                       // baseUrl/student (uses Index file from Student/Pages)
        Pages
            Index.cshtml
            Contact.cshtml
        StudentOrganisationOne    // baseUrl/student/studentOrganisationOne (uses Index file from Student/StudentOrganisationOne/Pages)
            Pages
                Index.cshtml      // This Index page would override the one in Student/Pages
        StudentOrganisationTwo    // baseUrl/student/studentOrganisationTwo (uses Index file from Student/Pages as it doesn't have its own)
            Pages
                Contact.cshtml    // This Contact page would override the one in Student/Pages
        StudentOrganisationThree
        ...                       // This organisation has no custom pages provided so would fall back to using those in Student/Pages
    Business
        BusinessOrganisationOne   // Same behaviour as in the Student scenario
            ...
        BusinessOrganisationTwo
            ...      

В двух словах, я хочу (я даже не уверен, возможно ли это / поддерживается), что если маршрут не существует, то механизм маршрутизации попробует следующий уровень выше для соответствия файла. Так что, взяв мой пример выше, если я запрашиваю baseUrl/student/studentOrganisationTwo, он откроет файл индекса внутри Student/Pages. Я предпочитаю маршрутизацию на основе соглашений, чтобы мне не приходилось переносить все приложение на использование контроллеров.

До сих пор я пробовал несколько подходов, которые не привели к желаемому результату:

  1. Маршрутизация на основе атрибутов с использованием атрибутов подобласти и ViewLocationExpander .
    • Этот подход в значительной степени зависит от маршрутизации атрибутов и наличия контроллеров, обрабатывающих внутренний интерфейс приложения, существующее приложение не использует контроллеры, поскольку достаточно методов обработчиков, предоставляемых Razor Pages (OnGetAsync(), OnPostAsync() и т. Д.).
      • Я попытался использовать гибридный подход с использованием маршрутов и SubAreaViewLocationExpander из приведенной выше статьи, но обнаружил, что не могу получить действительный маршрут, если файл не существует, то есть резервная часть не работает. Я объясняю это тем, что ViewLocationExpander действует только на файлы с директивой @page вверху (не уверен, насколько это верно, но именно это, как показало мое локальное тестирование).
  2. Согласованная маршрутизация с использованием пользовательского IRouter .
    • Этот подход выглядел намного больше как то, что я хотел, за исключением того, что в случае, когда существовал маршрут / файл, context.HttpContext.Request.Path.Value возвращал бы значение, такое как site.manifest вместо фактического маршрута. Когда маршрут / файл не существовал, он возвращал предоставленный маршрут (baseUrl/student/studentOrganisationTwo/Index), но я не мог заставить работать перенаправление, как показано в приведенной выше ссылке. Даже после создания необходимого контроллера и установки context.RouteData.Values["controller"] и context.RouteData.Values["action"] перенаправление не будет работать.
      • Я также не смог найти никакой документации о том, какие действительные значения были для установки ключа context.RouteData.Values.

Я рад предоставить примеры кода или разъяснения по любым вопросам.

...