使用子目录组织MVC2视图

本文关键字:MVC2 视图 子目录 | 更新日期: 2023-09-27 17:59:03

我们有一个相当大的MVC项目,包含大量视图和部分视图(显示/编辑器模板)。我们几乎95%的UI都在模板中,我们的aspx视图只是调用ascx模板的占位符。因此,每当我们在VS2010中打开Views文件夹时,向下滚动到Shared文件夹以管理模板是相当痛苦的。

我们想稍微改变一下这个层次结构。我们希望在Views下有一个名为Pages的文件夹,并在此处有我们的每个控制器文件夹,而不是在Views下为每个控制器都有一个文件夹。这样,当我们打开Views时,我们有两个文件夹:PagesShared

这是否很容易实现,而无需返回并编辑我们的每一个控制器(它们只是return View();return View("Pages/MyControllerName/MyActionHandler");)?我希望控制器仍然只是return View();,并且不更改我的URL。换句话说,我只想把我的Views的根目录移到Views/Pages中,而不是模板的根目录——它们保持原样。


我们采用的解决方案:

global.asax.cs:(将这些添加为Application_Start()的前2行-不更改其他内容)

        var locations = ((WebFormViewEngine)ViewEngines.Engines.First()).ViewLocationFormats.ToList().Select(x => x.ToLower().Replace("views/{", "Views/Pages/{"));
        ((WebFormViewEngine) ViewEngines.Engines.First()).ViewLocationFormats = locations.ToArray();

这允许我们的Views文件夹中有3个内容:

  1. 页码
  2. 共享
  3. web.config

由于我们95%的UI工作都是在SharedDisplayTemplatesEditorTemplates中完成的,这就避免了作为开发人员,大多数可忽略的东西一直出现在我们面前。虽然建议的答案是做ViewEngines.Engines.Clear();,然后添加一个新实例化的,但MVC在处理新实例时遇到了问题。因此,我们选择更改已实例化的函数实例。我不喜欢选角,我们会围绕这一点编写一些代码,以做得更好,但这是一个功能代码,可以让任何也想这样做的人开始使用。

使用子目录组织MVC2视图

您需要注册一个ViewEngine,并设置ViewLocationFormats属性以包括您的新位置。