C# 使用子目录组织MVC2视图

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文件夹以管理模板是相当痛苦的 我们想稍微改变一下这个层次结构。与其在视图下为每个控制器设置文件夹,不如在视图下设置名为页面的文件夹,并在此处设置每个控制器的文件夹。这样,当我们打开视图时,我们有两个文件夹:页面和共享 这是否很容易做到,而无需返回并编辑我们的每个控制

我们有一个相当大的MVC项目,其中包含大量视图和部分视图(显示/编辑器模板)。几乎95%的用户界面都在模板中,我们的
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();