C# 使用子目录组织MVC2视图
我们有一个相当大的MVC项目,其中包含大量视图和部分视图(显示/编辑器模板)。几乎95%的用户界面都在模板中,我们的C# 使用子目录组织MVC2视图,c#,asp.net-mvc,visual-studio-2010,asp.net-mvc-2,C#,Asp.net Mvc,Visual Studio 2010,Asp.net Mvc 2,我们有一个相当大的MVC项目,其中包含大量视图和部分视图(显示/编辑器模板)。几乎95%的用户界面都在模板中,我们的aspx视图只是调用ascx模板的占位符。因此,每当我们在VS2010中打开Views文件夹时,向下滚动到Shared文件夹以管理模板是相当痛苦的 我们想稍微改变一下这个层次结构。与其在视图下为每个控制器设置文件夹,不如在视图下设置名为页面的文件夹,并在此处设置每个控制器的文件夹。这样,当我们打开视图时,我们有两个文件夹:页面和共享 这是否很容易做到,而无需返回并编辑我们的每个控制
aspx
视图只是调用ascx
模板的占位符。因此,每当我们在VS2010中打开Views
文件夹时,向下滚动到Shared
文件夹以管理模板是相当痛苦的
我们想稍微改变一下这个层次结构。与其在视图下为每个控制器设置文件夹,不如在视图下设置名为页面的文件夹,并在此处设置每个控制器的文件夹。这样,当我们打开视图
时,我们有两个文件夹:页面
和共享
这是否很容易做到,而无需返回并编辑我们的每个控制器,它们只是returnview()代码>到返回视图(“页面/MyControllerName/MyActionHandler”)代码>?我希望控制器仍然只返回视图()代码>并且不更改我的URL。换句话说,我只想将视图的根目录移动到视图/页面中,而不是模板-它们保持原样
我们采用的解决方案:
global.asax.cs:(将这些添加为应用程序的前两行\u Start()
-不做任何更改)
这允许我们的视图
文件夹中包含3个内容:
页数
共享
web.config
由于我们95%的UI工作都是在共享的显示模板和编辑模板中完成的,因此这就避免了作为开发人员,最容易忽视的东西一直出现在我们面前。而建议的答案是执行ViewEngines.Engines.Clear()代码>然后添加一个新的实例,我们在MVC处理新实例时遇到了问题。因此,我们选择改变功能性的和已经实例化的实例。我不喜欢演员阵容,我们会在这方面添加一些代码,以便更好,但这是一个功能代码,可以让任何也想这样做的人开始使用。您需要使用ViewLocationFormats
属性集注册一个ViewEngine,以包括您的新位置。我可以重新注册默认的ViewEngine吗?我们没有使用剃须刀,我们使用的是默认的剃须刀。抱歉,这对我来说有点新。请从ViewEngines.Engines
中删除WebFormsViewEngine
,然后添加一个新实例。在那里看不到ViewPaths属性或任何明显的替代项<代码>ViewEngines.Engines.Clear();var engine=新的WebFormViewEngine();发动机。XXXXXXX????;ViewEngines.Engines.Add(引擎)代码>而且,显然,我在成为谷歌用户方面失败了-/哦,等等,我想我想要的是ViewLocationFormats?{0}
是视图名称<代码>{1}
就是你所知道的控制器。您可以将特定于控制器的模板放入EditorTemplates或DisplayTemplates子文件夹中,而不是将所有内容都放到共享文件夹中。示例:/Views/[ControllerName]/EditorTemplatesHmm,很高兴知道!我们不确定我们是否希望以这种方式组织它们,因为我们将ASPX文件与UI导航层次结构一起组织,但我们将ASCX文件与实体模型组织结构一起组织,两者甚至并不接近。然而,这是一个伟大的提示,我不知道!
var locations = ((WebFormViewEngine)ViewEngines.Engines.First()).ViewLocationFormats.ToList().Select(x => x.ToLower().Replace("views/{", "Views/Pages/{"));
((WebFormViewEngine) ViewEngines.Engines.First()).ViewLocationFormats = locations.ToArray();