【发布时间】:2011-06-14 15:15:26
【问题描述】:
我们有一个相当大的 MVC 项目,其中包含大量视图和部分视图(显示/编辑器模板)。几乎 95% 的 UI 都在我们的模板中,我们的 aspx 视图只是调用我们的 ascx 模板的占位符。因此,每当我们在 VS2010 中打开 Views 文件夹时,向下滚动到 Shared 文件夹来管理我们的模板是相当痛苦的。
我们想稍微改变一下这个层次结构。我们希望在Views 下有一个名为Pages 的文件夹,而不是在Views 下为每个控制器创建一个文件夹,并将每个控制器的文件夹放在此处。这样,当我们打开 Views 时,我们有 2 个文件夹:Pages 和 Shared。
这是否很容易实现,无需返回并编辑我们的每个控制器,它们只是 return View(); 到 return View("Pages/MyControllerName/MyActionHandler");?我希望控制器仍然只是 return View(); 并且我的 URL 没有改变。所以换句话说,我只想将我的视图的根目录移动到视图/页面中,而不是模板 - 它们保持原样。
我们采用的解决方案:
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 与新实例配合得很好的问题。所以我们选择改变功能和已经实例化的实例。我不喜欢演员表,我们会在这方面添加一些代码以使其更好,但这是让任何想要这样做的人开始的功能代码。
【问题讨论】:
-
只是让你知道。您可以将特定于控制器的模板放在 EditorTemplates 或 DisplayTemplates 子文件夹中,而不是将所有内容放在 Shared 文件夹中。示例:/Views/[ControllerName]/EditorTemplates
-
嗯,很高兴知道!不确定我们是否希望以这种方式组织它们,因为我们将 ASPX 文件与 UI 导航层次结构一起组织,但我们沿着实体模型组织结构组织我们的 ASCX 文件,并且两者甚至不接近。然而,这是一个我不知道的好技巧!
标签: c# asp.net-mvc visual-studio-2010 asp.net-mvc-2