使用子目录组织MVC2视图
本文关键字:MVC2 视图 子目录 | 更新日期: 2023-09-27 17:59:03
我们有一个相当大的MVC项目,包含大量视图和部分视图(显示/编辑器模板)。我们几乎95%的UI都在模板中,我们的aspx
视图只是调用ascx
模板的占位符。因此,每当我们在VS2010中打开Views
文件夹时,向下滚动到Shared
文件夹以管理模板是相当痛苦的。
我们想稍微改变一下这个层次结构。我们希望在Views
下有一个名为Pages
的文件夹,并在此处有我们的每个控制器文件夹,而不是在Views
下为每个控制器都有一个文件夹。这样,当我们打开Views
时,我们有两个文件夹:Pages
和Shared
。
这是否很容易实现,而无需返回并编辑我们的每一个控制器(它们只是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个内容:
- 页码
- 共享
- web.config
由于我们95%的UI工作都是在Shared
DisplayTemplates
和EditorTemplates
中完成的,这就避免了作为开发人员,大多数可忽略的东西一直出现在我们面前。虽然建议的答案是做ViewEngines.Engines.Clear();
,然后添加一个新实例化的,但MVC在处理新实例时遇到了问题。因此,我们选择更改已实例化的函数实例。我不喜欢选角,我们会围绕这一点编写一些代码,以做得更好,但这是一个功能代码,可以让任何也想这样做的人开始使用。
您需要注册一个ViewEngine,并设置ViewLocationFormats
属性以包括您的新位置。