ASP.NET Бета-версия MVC - Возможна группировка контроллеров и представлений?

StackOverflow https://stackoverflow.com/questions/231214

Вопрос

Я нахожусь на пути к созданию 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top