Здесь вы действительно хотите, чтобы иерархия папок Views соответствовала иерархии пространства имен ваших контроллеров. Вы можете написать собственный ViewEngine, чтобы сделать это довольно легко - подробнее см. Мой проект ControllerPathViewEngine на GitHub .
Я включил фрагмент класса ControllerPathRazorViewEngine, чтобы описать, как он работает. Перехватывая методы FindView / FindPartialView и заменяя имя контроллера на путь к папке (на основе пространства имен и имени контроллера), мы можем получить его для загрузки представлений из вложенных папок в основной папке Views.
public class ControllerPathRazorViewEngine : RazorViewEngine
{
//... constructors etc.
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
return FindUsingControllerPath(controllerContext, () => base.FindView(controllerContext, viewName, masterName, useCache));
}
public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
{
return FindUsingControllerPath(controllerContext, () => base.FindPartialView(controllerContext, partialViewName, useCache));
}
private ViewEngineResult FindUsingControllerPath(ControllerContext controllerContext, Func<ViewEngineResult> func)
{
string controllerName = controllerContext.RouteData.GetRequiredString("controller");
string controllerPath = controllerPathResolver.GetPath(controllerContext.Controller.GetType());
controllerContext.RouteData.Values["controller"] = controllerPath;
var result = func();
controllerContext.RouteData.Values["controller"] = controllerName;
return result;
}
}