ASP.NET MVC Beta - возможно ли группирование контроллеров и представлений? - PullRequest
2 голосов
/ 23 октября 2008

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

/ Views / Home / index.aspx /Views/Home/About.aspx

до

/ Блог / Views / Home / index.aspx /Blog/Views/Home/About.aspx

/ Форум / Views / Home / index.aspx /Forum/Views/Home/About.aspx

Цель состоит в том, чтобы получить некоторое разделение между «приложениями» в одном веб-проекте, что-то вроде того, что Томас Оуэнс уже задал здесь: В рамках MVC, какую структуру каталогов ожидают другие разработчики?

Конечно, это должно включать и контроллеры, а не только представления.

Ответы [ 3 ]

1 голос
/ 05 ноября 2008

Я только что написал сообщение в блоге, в котором описан один подход к группированию контроллеров, который похож на «области» в монорельсе. Хотя это еще не относится к вложенным областям.

http://haacked.com/archive/2008/11/04/areas-in-aspnetmvc.aspx

1 голос
/ 24 октября 2008

Да, это должно быть возможно сделать. Я могу думать об одном пути; могут быть и другие.

Первый шаг - изменить маршрут по умолчанию, включив в него имя вашего приложения:

routes.MapRoute("Default",
                "{applicationName}/{controller}/{action}/{id})",
                null, null);

Я предполагаю, что вы собираетесь сгруппировать два «приложения» в разные пространства имен в пределах одной сборки. Таким образом, у вас может быть два пространства имен, таких как:

  • MyApp.Blog.Controllers
  • MyApp.Forum.Controllers

Затем вам нужно изменить фабрику контроллеров, чтобы она создавала правильный контроллер. Вы можете сделать это, введя подтип 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.

0 голосов
/ 24 октября 2008

Это не новая концепция. Это называется "районы" в Монорельс . В последнее время на форуме ATL.NET и других местах было много шума по этой теме. Стив Сандерсон придумал способ сделать это , но, очевидно, это оставляет некоторые проблемы. В повторном ответе, очевидно, команда MVC собирается " углубленный взгляд " на это в будущем выпуске.

...