ASP MVC文件夹层次结构

时间:2009-03-11 23:03:13

标签: asp.net asp.net-mvc directory

我有一个相当大的ASP MVC应用程序。我宁愿创建一些层次结构,而不是在控制器目录中都有多个控制器。所以我可能会有像

这样的东西
~\Controllers\Security\
~\Controllers\Maintenance\
~\Controllers\Reports\

我也希望能够与Views

做类似的事情
~\Views\Security\Users\
~\Views\Security\Roles\
~\Views\Maintenance\Customer\
~\Views\Maintenance\Product\

这很容易吗?

5 个答案:

答案 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;
        }
    }