ASP.NET MVC:多视图文件夹和_ViewStart.cshtml文件

时间:2013-03-07 22:15:54

标签: asp.net-mvc asp.net-mvc-3 razor viewengine

我有一个MVC项目,需要有2个不同的View文件夹。一个是~/Views/,一个是~/Framework/Views/。这是通过基于剃刀视图引擎创建自定义视图引擎来完成的,如下所示:

public class MyViewEngine : RazorViewEngine
{
    private static string[] AdditionalViewLocations = new[]{
        "~/Framework/Views/{1}/{0}.cshtml",
        "~/Framework/Views/{1}/{0}.vbhtml",
        "~/Framework/Views/Shared/{0}.cshtml",
        "~/Framework/Views/Shared/{0}.vbhtml"
    };

    public MyViewEngine()            
    {
        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(AdditionalViewLocations).ToArray();
        base.ViewLocationFormats = base.ViewLocationFormats.Union(AdditionalViewLocations).ToArray();
        base.MasterLocationFormats = base.MasterLocationFormats.Union(AdditionalViewLocations).ToArray();
    }
}

问题是我想在2个Views文件夹的每一个中使用不同的_ViewStart.cshtml文件(即~/Views/_ViewStart.cshtml用于~/Views/文件夹中的视图和~/Framework/Views/_ViewStart.cshtml用于视图的视图在~/Framework/Views/文件夹中找到,但View Engine只使用它找到的第一个~/Views/中的原始文件。

这可能吗?

谢谢

2 个答案:

答案 0 :(得分:6)

这绝对是可能的,我想你错过了什么。

我自己使用您提供的视图引擎(逐字复制和粘贴)对此进行了测试。我没有看到与你相同的行为。我有两个_ViewStart.cshtml个文件,一个在~/Framework/Views/_ViewStart.cshtml,一个在~/Views/_ViewStart.cshtml

当我在~/Framework/Views/内运行视图时,它使用Framework文件夹中的_ViewStart.cshtml。当我在~/Views/内运行视图时,它会使用Views文件夹中的_ViewStart.cshtml

使用DotPeek仔细检查RazorViewEngine中的代码也可以确认这是它应该如何表现的。视图引擎在与正在呈现的视图相同的文件夹中开始检入名为_ViewStart.cshtml的文件,然后在目录树中向上走,直到它到达应用程序的根目录。

答案 1 :(得分:3)

_ViewStart的选择是分层的,但您已将~/Framework/Views与[{1}}平行添加。我认为Razor并不是真正做你想要的(即两个完全平行的视图位置)。如果您要将~/Views放入主Framework文件夹,那么您的Views会正常加载。