使用子目录组织MVC2视图

时间:2011-06-14 15:15:27

标签: c# asp.net-mvc visual-studio-2010 asp.net-mvc-2

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

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

这是否可以轻松实现,而无需返回并编辑我们只需return View();return View("Pages/MyControllerName/MyActionHandler");的每个控制器?我希望控制器仍然只是return View();而且我的网址没有变化。换句话说,我只想将我的视图的根目录移动到视图/页面中,而不是模板 - 它们保持不变。


我们采用的解决方案:

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

        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. 的web.config
  3. 由于我们在Shared DisplayTemplatesEditorTemplates内完成了95%的用户界面工作,因此这一点可以让所有人都不知所措。 。虽然建议的答案是ViewEngines.Engines.Clear();然后添加一个新实例化的答案,但我们遇到的问题是MVC与新的一起玩得很好。所以我们选择改变功能和已经实例化的实例。我不喜欢这个转换,我们会在它周围添加一些代码以便更好,但这是让任何人开始的功能代码,也希望这样做。

1 个答案:

答案 0 :(得分:2)

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