У меня нет лучшего решения, но я попытаюсь реализовать собственный 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 по умолчанию не хочет отражать всю сборку в поисках контроллера при сопоставлении маршрута с конкретным контроллером .
Почему бы просто не использовать районы? ASP.NET MVC 2 имеет их. –