2014-11-14 8 views
1

short question:Несколько контроллеров по умолчанию для маршрута

Есть ли способ настроить несколько контроллеров по умолчанию в маршруте?

Long Объяснение:

Я создаю что-то похожее на portable area в MVC 5. В частности, я хочу, чтобы создать своего рода контроллер по умолчанию, который будет уволен из моего портативного компонента, если пользователь не создает его в его заявлении. Точнее:

  • Предположим, у меня есть приложение MVC, которое устанавливает мою инфраструктуру через NuGet.
  • Этот компонент устанавливает кучу представлений в папке _framework, а DLL получает ссылку и приложение MVC начинает наследовать от моего FrameworkHTTPApplication.
  • Этот базовый класс по умолчанию настраивает некоторые вещи, такие как Engine Engine Engine, который ищет представления в папке _framework и маршрутах по умолчанию.
  • Теперь я хочу, чтобы приложение могло создавать или не создавать свои HomeController: если они его не создают, фреймворк будет вызывать FrameworkHomeController (внутри библиотеки DLL), но если они его создают, он получает доступ к удару ~ /.

Я смог создать контроллер по умолчанию в фреймворке и правильно подключить его, но он не отступит. Это то, что показывает routeDebugger: routes

Как вы видите, у меня настроены оба маршрута (одинаковый URL-адрес, разные значения по умолчанию). То, что я ожидаю, будет: если контроллер Home не существует, то следует называть FrameworkHome.

Я играл с пространствами имен, но результат тот же.

Любые подсказки о том, как это сделать?

ответ

1

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

Предположим, что контроллеры приложений определены в пространстве имен MyApplication.Controllers, а контроллеры структуры определены в пространстве имен Framework.Controllers.

Для корневого URL / вы хотите, чтобы приложение и контроллер:

  • MyApplication.Controllers.HomeController если определено

  • В противном случае контроллер Framework.Controllers.HomeController (обратите внимание, это также называется HomeController и не FrameworkHomeController, однако его определяется в пространстве пространств каркаса)

Это достигается с помощью одного маршрута по умолчанию:

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    namespaces: new[] { "MyApplication.Controllers" }     
); 

Tha пространств имен, определенных в маршруте приоритет отдается, когда несколько контроллеров согласующие найдены.Таким образом, для корневого URL / используется имя контроллера Home по умолчанию, и если система обнаружит 2 контроллера MyApplication.Controllers.HomeController и Framework.Controllers.HomeController, тогда будет использоваться номер в пространстве имен MyApplication.Controllers.

+0

Он работал красиво. Одна вещь, я ошибался, это пространство имен; Я добавил его без части «Контроллеры», и это было проблемой. Как только я изменил маршрут, чтобы использовать все пространство имен, он начал работать отлично. –

Смежные вопросы