Вложенные / многоуровневые контроллеры ASP.NET Core - PullRequest
4 голосов
/ 20 марта 2019

Привет, друзья, переполненные накопители!Нужна ваша помощь в отношении наличия многоуровневых или вложенных контроллеров в ядре asp.net

Итак, далеко от того, что я вижу, стандартный шаблонный код и его маршрут по умолчанию {controller=Home}/{action=Index}/{id?} позволяют только контроллерам находиться вкаталог по умолчанию Controllers , который вообще не допускает вложений.

Из того, что я видел до сих пор, есть несколько способов обойти это, ни один из которых, на мой взгляд, не идеален.

  1. 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 без:

  1. Razor View Pages (MVVM)
  2. Атрибуты маршрута для каждого отдельногоВложенный контроллер
  3. Добавление маршрутов вручную для каждой возможной комбинации вложенных родительских и дочерних элементов
...