Привет, друзья, переполненные накопители!Нужна ваша помощь в отношении наличия многоуровневых или вложенных контроллеров в ядре asp.net
Итак, далеко от того, что я вижу, стандартный шаблонный код и его маршрут по умолчанию {controller=Home}/{action=Index}/{id?}
позволяют только контроллерам находиться вкаталог по умолчанию Controllers , который вообще не допускает вложений.
Из того, что я видел до сих пор, есть несколько способов обойти это, ни один из которых, на мой взгляд, не идеален.
- Razor View Pages
Из коробки может показаться, что Razor Pages автоматически обойдут эту проблему как ядро .netпытается просмотреть соответствующую структуру папок из связанной структуры URL, чтобы попытаться найти файл .cshtml , который соответствует маршруту.
Проблема?Это скорее образец MVVM, чем образец MVC.На мой взгляд, меньшее из 3 зол (открыто для обсуждения)
Атрибуты маршрута Другая альтернатива, которую я вижу, состоит в том, что контроллеры могут быть связаны с маршрутами с использованием атрибута маршрута на контроллерах и действиях [Route("parent/route/path")]
Эта проблема?Одно и то же пространство имен (папка) означает отсутствие повторного использования имен контроллеров и, учитывая природу нашего приложения, нам нужно пространство имен наших контроллеров.Не говоря уже о том, что это сделает папку контроллера массивной, с сотнями файлов контроллеров.
Добавление большего количества маршрутов Добавление большего количества маршрутов вручную будет болезненным, так как я должен добавить новый маршрут для каждой возможной перестановки родителя и ребенка в папкеструктура.
Хотя я понимаю, что это может быть предполагаемый способ делать вещи.На мой взгляд, добавление каждой новой вложенной папки в новый маршрут - плохой дизайнПоскольку это то, что может быть автоматически выведено из маршрута к структуре папок.И автоматически выполняется на других языках и фреймворках автоматически.(Один прекрасный пример библиотек классов C #)
Соль в ране
Наиболее важно, что, очевидно, невозможно иметь один и тот же именованный контроллер в двух совершенно разных папках / маршрутах: Как использовать одно и то же имя контроллера в разных пространствах имен .Когда это происходит, вы получаете исключение AmbiguousActionException: Multiple actions matched.
. Самая большая проблема для меня заключается в том, что пространства имен поддерживаются в обычной версии .NET MVC Framework.По какой-то замечательной причине параметр пространства имен был удален из MapRoute()
метода кем-то из Microsoft.Почесывая голову о том, почему это было сделано?
Не «просто» - разглагольствование
Прежде чем я продолжу, этот пост не я ною или ругаю, я искреннеищу лучшее решение и ищу другие идеи и альтернативы.Пожалуйста, продолжайте читать для моего идеального решения ниже.
Идеальное решение
Так как я пришел из PHP фона, я обнаружил, что просто с использованием по умолчанию spl_register_autoloader()
дал мне именно то, что я хотел.Возможность для меня зарегистрировать определенное пространство имен по своему выбору, а для PHP - просмотреть все части последующего пространства имен в структуре папок локального каталога для желаемого контроллера.
, то есть контроллер PHP Controllers\NestingLevel1\NestingLevel2\HomeController
будет искать соответствующий контроллер в Controllers \ NestingLevel1 \ NestingLevel2 \ HomeController.php
Простой, Красивый и Я упоминал Простой?
Заключение
Есть ли способ получить вложенные контроллеры в ядре ASP.NET без:
- Razor View Pages (MVVM)
- Атрибуты маршрута для каждого отдельногоВложенный контроллер
- Добавление маршрутов вручную для каждой возможной комбинации вложенных родительских и дочерних элементов