Структура пользовательских папок в ASP.NET MVC 5

Я пытаюсь определить, возможно ли (или практично) реализовать архитектуру критики дяди Боба в ASP.NET MVC 5 вместо использования структуры папок по умолчанию.

Здесь ссылка на описание Кричащей архитектуры: http://blog.8thlight.com/uncle-bob/2011/09/30/Screaming-Architecture.html

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

Корень

  • Клиенты
    • Контроллеры
      • CustomerController.cs
    • Модели
      • Customer.cs
    • Просмотров
      • Index.cshtml
      • Details.cshtml
      • Update.cshtml
  • Сотрудники
    • Контроллеры
      • EmployeesController.cs
    • Модели
      • Employee.cs
    • Просмотров
      • Index.cshtml
      • Details.cshtml
      • Update.cshtml
  • Общий
    • Просмотров
      • _Layout.cshtml
      • Error.cshtml
  • _ViewStart.cshtml
  • Web.config

Соответствующие маршруты URL будут выглядеть так:

Я создал пользовательский RazorViewEngine и добавил соответствующие форматы местоположения (например, "~/{1}/Views/{0}.cshtml" ) и форматы форматов частичного просмотра (например, "~/Shared/Views/{ 0}.cshtml" ). Я также переместил общий_ViewStart.cshtml в корневой каталог и объединил папку web.config Views/Shared с корневым уровнем web.config, чтобы избежать дублирования этих двух файлов во всех папках View.

Все работает отлично, однако, если я попытаюсь перейти на индексную страницу (например, http://www.example.com/employees/), я получаю ошибку 403.14 (запрещен), Все остальные маршруты (в том числе http://www.example.com/employees/index) работают нормально.

Я предполагаю, что IIS явно блокирует маршрут к методу индекса контроллера, потому что URL-адрес совпадает с папкой в ​​файловой системе, и просмотр каталогов по умолчанию отключен. Однако, если я разрешаю просмотр каталогов, это фактически приводит меня к фактическому списку каталогов, а не к методу индекса контроллера.

Я могу перемещать папки "Клиенты и сотрудники" в подпапку (т.е. вытеснять их из корня), и все работает отлично, но я хотел бы попытаться сохранить эти папки на верхнем уровне (в соответствии с рекомендациями Screaming Architecture).

Есть ли у кого-нибудь решение этой проблемы?

Обратите внимание, что область MVC не является решением, которое я ищу, поскольку оно не позволяет описывать описанную выше структуру папок (то есть папки верхнего уровня, названные в честь использования высокоуровневых вариантов использования и представлений, содержащихся непосредственно в папке представлений чем во вложенной папке).

Ответ 1

Я уверен, что вы правы в IIS. Если у вас есть два пути, сопоставленные с одним и тем же ресурсом, физический путь сначала проверяется на стороне IIS.

Я искал конфигурацию маршрутов и нашел свойство RouteExistingFiles в RouteCollection и подумал, что это может сработать.

Я установил значение true и тестировал локально с пустой папкой в ​​проекте, перенаправлением маршрута на Home/Index и переходом на localhost:xxx/MyFolder. Он работал правильно.

Итак, все, что вам нужно сделать, это установить для этого свойства значение true, чтобы он сначала выбирал маршруты Asp.net, а не физические маршруты.