ASP.NET Бета-версия MVC - Возможна группировка контроллеров и представлений?
-
04-07-2019 - |
Вопрос
Я нахожусь на пути к созданию ASP.NET Приложения MVC с последней бета-версией, и мне интересно, возможно ли изменить макет проекта по умолчанию для
/Просмотры/Главная страница/Index.aspx / Просмотры/Главная страница/About.aspx
Для
/Блог/Просмотры/ Главная страница/Index.aspx /Блог/Просмотры/ Главная страница/ About.aspx
/Форум/Просмотры/Главная страница/Index.aspx /Форум/Просмотры/ Главная страница/ About.aspx
Цель состоит в том, чтобы получить некоторое разделение между "приложениями" в рамках одного веб-проекта, что-то вроде того, что уже задавал здесь Томас Оуэнс: В рамках MVC-фреймворка, какую структуру каталогов ожидали бы другие разработчики?
Конечно, это должно включать также контроллеры, а не только представления.
Решение
Это не новая концепция.Это называется "области" в Монорельс.В последнее время было много шума по поводу этой темы на ATL.NET форум и в других местах.Стив Сандерсон придумал способ сделать это но, очевидно, это оставляет некоторые проблемы.В ответ, по-видимому, команда MVC собирается предпринять "глубокий взгляд" над этим для будущего релиза.
Другие советы
Да, это должно быть возможно сделать.Я могу придумать один способ;могут быть и другие.
Первый шаг - изменить маршрут по умолчанию, включив в него имя вашего приложения:
routes.MapRoute("Default",
"{applicationName}/{controller}/{action}/{id})",
null, null);
Я предполагаю, что вы собираетесь сгруппировать два "приложения" в разные пространства имен в рамках одной сборки.Таким образом, у вас может быть два пространства имен, таких как:
- MyApp.Blog.Контроллеры
- MyApp.Форум.Контроллеры
Далее вам нужно изменить фабрику контроллера, чтобы она создавала экземпляр нужного контроллера.Вы можете сделать это, введя подтип DefaultControllerFactory и переопределив метод GetControllerType:
protected override System.Type GetControllerType(string controllerName)
{
string applicationName;
if (RequestContext != null &&
RequestContext.RouteData.Values.TryGetValue(
"applicationName", out applicationName)) {
// return controller type using app name to
// look up namespace and controllerName argument
return ...
}
// if no match, maybe it's a different controller/route
return base.GetControllerType(controllerName);
}
Наконец, вам нужно сообщить MVC, чтобы он использовал ваш ControllerFactory.В Global.asax.cs:
private void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(
MyApp.MyControllerFactory());
}
Расположение видов может быть обработано аналогичным образом.В этом случае вы вводите подтип WebFormViewEngine.
Я только что написал сообщение в блоге, в котором описывается один подход к группировке контроллеров, похожий на "зоны" в монорельсе.Однако это пока не касается вложенных областей.
http://haacked.com/archive/2008/11/04/areas-in-aspnetmvc.aspx