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