2010-03-26 3 views
1

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

То, что я хочу, чтобы иметь другую директорию перед регулятором, так что, как я могу отделить контроллер в «модуль»

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

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

+1

Почему бы просто не использовать районы? ASP.NET MVC 2 имеет их. –

ответ

1

У меня нет лучшего решения, но я попытаюсь реализовать собственный 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 
    } 
} 

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

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

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

ControllerBuilder.Current.DefaultNamespaces.Add («Module.Controllers.something»);

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

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