我有一个相当大的ASP MVC应用程序。我宁愿创建一些层次结构,而不是在控制器目录中都有多个控制器。所以我可能会有像
这样的东西~\Controllers\Security\
~\Controllers\Maintenance\
~\Controllers\Reports\
我也希望能够与Views
做类似的事情~\Views\Security\Users\
~\Views\Security\Roles\
~\Views\Maintenance\Customer\
~\Views\Maintenance\Product\
这很容易吗?
答案 0 :(得分:4)
我认为你正在寻找类似“大师”在这篇文章中所说的内容:
http://haacked.com/archive/0001/01/01/areas-in-aspnetmvc.aspx
基本上,您必须创建一个ViewEngine来指定查找视图的位置。这是一个相当简单的代码,只是不要忘记在global.asax中注册它!至于控制器部分,您还必须在global.asax中注册新路由。
答案 1 :(得分:2)
您正在搜索的概念称为“区域”,如Phil Haack所述: http://haacked.com/archive/2008/11/04/areas-in-aspnetmvc.aspx
答案 2 :(得分:1)
我认为你需要编写自己的RouteHandler,这不应该太强硬。
快速谷歌搜索出现了:This blog post detailing it
答案 3 :(得分:1)
您是否考虑过切换到功能文件夹。我已经尝试过(稍加修改)并且效果很好。
在这篇文章中描述 http://timgthomas.com/2013/10/feature-folders-in-asp-net-mvc/
代码示例在Jimmiy Bogard的回购中 https://github.com/jbogard/presentations/tree/master/putyourcontrollersonadietv2
答案 4 :(得分:0)
您真正想要的是您的Views文件夹层次结构与控制器的命名空间层次结构相匹配。您可以编写自定义ViewEngine来轻松完成此操作 - 有关详细信息,请参阅我的ControllerPathViewEngine project on GitHub。
我已经包含了一个ControllerPathRazorViewEngine类的片段来概述它是如何工作的。通过拦截FindView / FindPartialView方法并用文件夹路径替换控制器名称(基于控制器命名空间和名称),我们可以让它从主视图文件夹中的嵌套文件夹加载视图。
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;
}
}