Как изменить MapRoute (добавить новый каталог) - PullRequest
1 голос
/ 26 марта 2010

Как мне изменить маршрут моей карты, чтобы у меня был другой каталог, а не только контроллеры и действия.

Я хочу иметь другой каталог перед контроллером, чтобы я мог разделить контроллер на «модуль»

        routes.MapRoute(
            "Default",                                       // Route name
            "{module}/{controller}/{action}/{id}",           // URL with params
            new { module = "module", controller = "controller", action = "Index", id = ""}

Это то, что я хочу, но код не работает. Что еще мне нужно изменить, чтобы изменить MapRoute?

Ответы [ 2 ]

4 голосов
/ 26 марта 2010

Рассматривали ли вы возможность использования функции Области в ASP.NET MVC 2? Он может удовлетворить ваши требования по разделению сайта на отдельные «модули».

Пошаговое руководство. Организация приложения ASP.NET MVC с использованием областей

1 голос
/ 26 марта 2010

У меня нет лучшего решения, но я бы попытался реализовать свой собственный ViewEngine.

Если ваши контроллеры находятся в модулях, которые не соответствуют стандартному соглашению ASP.NET MVC и маршруты не могут быть разрешены.

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

Например:

    public class ModuleViewEngine: WebFormViewEngine
{
    public ModuleViewEngine()
    {
        ViewLocationFormats = new[]
                    {
                        "~/views/{2}/{1}/{0}.aspx",
                        "~/views/{2}/{1}/{0}.ascx",
                        "~/views/Shared/{1}/{0}.aspx",
                        "~/views/Shared/{1}/{0}.ascx",
                    };
        MasterLocationFormats = new[]

        {
                "~/views/{1}/{0}.master",
                "~/views/Shared/{0}.master",
                "~/views/{2}/{1}/{0}.master",
                "~/views/{2}/Shared/{0}.master",
        };
    }

    public override ViewEngineResult FindPartialView(ControllerContext controllerContext,
    string partialViewName, bool useCache)
    {
        //coede
    }

    public override ViewEngineResult FindView(
        ControllerContext controllerContext,
    string viewName, string masterName, bool useCache)
    {
        //code
    }
}

мы переопределяем форматы ViewLocation и MasterLocationFormats массивы для размещения дополнительного параметра (области). Места просмотра используют стандартные заполнители форматирования строк. Первый заполнитель, обозначает действие название. Второй заполнитель, это имя контроллера и последний заполнитель, это имя модуля (если указано).

Методы FindPartialView и FindView, поэтому мы также должны переопределить их.

Поскольку наши контроллеры теперь находятся в подпапке папки Controllers, мы должны зарегистрировать дополнительные пространства имен контроллеров:

ControllerBuilder.Current.DefaultNamespaces.Add ( "Module.Controllers.something");

Это необходимо, потому что ControllerBuilder по умолчанию не хочет отражать над вся сборка ищет контроллер при сопоставлении маршрута с конкретным контроллер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...