ASP MVC文件夹层次结构

3

我有一个相当大的ASP MVC应用程序。与其在控制器目录中拥有许多控制器,我宁愿创建一些层次结构。因此,我可能会有类似这样的东西

~\Controllers\Security\
~\Controllers\Maintenance\
~\Controllers\Reports\

我也希望能够使用视图来实现类似的功能。
~\Views\Security\Users\
~\Views\Security\Roles\
~\Views\Maintenance\Customer\
~\Views\Maintenance\Product\

这个很容易做到吗?

5个回答

4
我认为您需要的是这篇帖子中“大师”所说的内容:http://haacked.com/archive/0001/01/01/areas-in-aspnetmvc.aspx。基本上,您必须创建一个ViewEngine来指定视图的位置。这是一段相当简单的代码,只需不要忘记在global.asax中注册即可!至于控制器部分,您还需要在global.asax中注册新的路由。

2

哎呀,我永远都不够快!! - Portman

1

1

0

在这里,您真正想要的是让您的Views文件夹层次结构与控制器的命名空间层次结构匹配。您可以编写一个自定义的ViewEngine来轻松实现此目标 - 请参阅我在GitHub上的ControllerPathViewEngine项目获取详细信息。

我已经包含了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;
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接