У меня нет конкретного ответа на ваш вопрос, так как я не уверен в своем понимании этого вопроса. Однако у меня есть общее ощущение направления для решения.
Когда кто-то начинает менять расположение представлений, соответствующие методы, которые находят эти представления, также должны измениться. Простой подход - переопределить методы FindView
и FindPartialView
.
Простая демонстрация. Я создал область под названием Blog, контроллер Blog с методом Index. В моем случае я использую действие контроллера как SubFolder, но я уверен, что это может быть распространено на ваш случай для каждой папки продукта. Я предполагаю, что продукт будет аргументом запроса. Площадь http://www.freeimagehosting.net/uploads/85b5306402.gif
Основная идея состоит в том, чтобы запросить контроллерный контекст для контроллера, области, действия и идентификатора и изменить то, что ищет стандартное представление. Расположение по умолчанию для видов области выглядит как "~/Areas/{2}/Views/{1}/{0}.aspx"
, поэтому мы можем в основном вводить значения для имени вида и в этом случае ActionName/Index
. Местом просмотра будет ~/Area/Blog/Views/Blog/Index/Index.aspx
.
Это всего лишь грубый набросок кода, который можно использовать. Сравнение строк определенно можно обновить до более надежных методов. В нынешнем виде этот метод будет работать для всего приложения, как и ожидалось, за исключением случая, когда в область «Блог» поступает запрос на действие «Индекс».
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
if (controllerContext.RouteData.DataTokens ["Area"] == "Blog" )
{
if (String.Compare(controllerContext.RouteData.Values ["Action"].ToString(),"Index",true) == 0)
{
var viewLocation = String.Format("{0}/{1}", controllerContext.RouteData.Values["Action"].ToString(), viewName);
return base.FindView(controllerContext, viewLocation , masterName, useCache);
}
}
return base.FindView(controllerContext, viewName, masterName, useCache);
}