Изменить расположение контроллера внутри структуры проекта - PullRequest
0 голосов
/ 07 февраля 2012

Я нашел это сообщение (Как расширить, где MVC ищет представления) об изменении местоположения представления.

Мне было интересно, есть ли что-то подобное для изменения местоположения контроллера.

Я просто хочу изменить расположение класса внутри проекта и не хочу влиять на URL.

Например, вместо размещения контроллера в

MyMvcProject\Controllers\
                      MyController1.cs 
                      MyController2.cs 
                      MyController3.cs 

Я хочу достичь чего-то вроде

MyMvcProject\MyGroup1\
                      MyController1.cs
                      MyController2.cs

MyMvcProject\MyGroup2\
                      MyController3.cs

, а также области поддержки:

MyMvcProject\Areas\MyGroup3\
                      MyController4.cs

Возможно ли этого добиться? И если да, где я могу найти документацию по этому поводу?

Ответы [ 6 ]

3 голосов
/ 12 февраля 2012

Вы можете делать то, что вы хотите, и это не требует какой-либо специальной настройки, потому что ASP.NET MVC не заботится о том, где вы размещаете свои контроллеры.Во-первых, контроллеры расположены с использованием отражения, поэтому имя папки, в которую вы помещаете свои контроллеры, не имеет значения.Контроллеры ищутся по имени типа и, возможно, по пространству имен (для устранения неоднозначности).Вы даже можете иметь контроллеры в отдельных проектах / сборках.Пока контроллер находится в сборке в папке bin, он доступен для поиска в рамках.

1 голос
/ 14 февраля 2012

Как уже говорили другие, вам необходимо выполнить одно из следующих действий:

  1. Извлечь из интерфейса IControllerFactory и обеспечить реализацию методов CreateController и ReleaseController.
  2. Получите из DefaultControllerFactory и переопределите поведение по умолчанию.

Вот несколько ссылок, с которых можно начать:

Кроме того, если вы готовы потратить немного денег, я бы также порекомендовал книгу Pro ASP.NET MVC 3 Framework , так как это объясняет почти каждый аспект того, как можно настроить инфраструктуру MVC (включаяпример того, как создать собственную фабрику контроллеров - исходный код для которой можно бесплатно загрузить с сайта издателя).

1 голос
/ 11 февраля 2012

Как уже упоминалось выше, вам нужно создать фабрику контроллеров для поддержки вашего пользовательского разрешения.Вот пример:

http://develoq.net/2010/custom-controller-factory-in-asp-net-mvc/

0 голосов
/ 12 февраля 2012

То, что вы спрашиваете, и то, что показывает ваш пример, это две разные вещи;в зависимости от того, какого из них вы хотите достичь, вам может потребоваться или не потребоваться выполнять какую-либо работу.

Для того, чтобы класс был контроллером в MVC Framework, существует два требования:

  1. У него должно быть имя класса Имя + "Контроллер"
  2. У него должен быть открытый конструктор без параметров.

Ваш пример "нормального" MVCмакет на самом деле недействителен:

MyMvcProject\Controllers\
                      MyController1.cs 
                      MyController2.cs 
                      MyController3.cs 

Эти классы не будут найдены MVC, поскольку они не имеют правильного имени, независимо от того, в какой папке они находятся.

Если всевы хотите изменить имена пространств / папок, которые «просто работают», при условии, что вы называете их так же, как и соответствующие сегменты маршрута:

MyMvcProject\MyGroup1\
                      Page1Controller.cs
                      Page2Controller.cs
MyMvcProject\MyGroup2\
                      Page3Controller.cs
MyMvcProject\Areas\Area1\
                      Area1Page1Controller.cs

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

Если вы действительно хотите назвать их SomethingController1 или SomethingElseController5, или иначе изменитьмаршрут -> отображения имени класса, то вы до необходимо реализовать пользовательский ControllerFactory и вставить его в конвейер MVC.

В Интернете есть множество примеров того, как это сделать, включая опубликованный ранее ,

0 голосов
/ 07 февраля 2012

Я полагаю, что вы не можете изменить соглашение, если не создадите свою собственную ControllerFactory.

Если вы действительно хотите это сделать, просто реализуйте интерфейс IControllerFactory (или попытайтесь получить его из DefaultControllerFactory).

Затем ваш Application_Start зарегистрирует фабрику вашего контроллера, используя метод ControllerBuilder.Current.SetControllerFactory.

Для получения подробной информации обратитесь к документации ControllerFactory и к исходному коду MVC.

0 голосов
/ 07 февраля 2012

Я думаю, что это невозможно сделать.ASP.NET MVC определили соглашение, которому мы должны следовать.Контроллеры находятся в папке Controllers, представления - в Views {ControllerName} \

...