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