5

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

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/~/Views/

这可能吗?

谢谢

4

2 回答 2

7

这绝对是可能的,我想你只是错过了一些东西。

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

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

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

于 2013-03-09T01:49:25.503 回答
3

的选择_ViewStart是分层的,但您已添加~/Framework/Views并行到~/Views. 我不认为 Razor 设置为实际执行您想要的操作(即两个完全平行的视图位置)。但是,如果您要放入FrameworkViews文件夹,则您_ViewStart的 s 将正确加载。

于 2013-03-07T22:29:36.793 回答