2013-03-07 35 views
4

我有一个MVC项目,需要有2个不同的视图文件夹。一个在~/Views/,另一个在~/Framework/Views/。这是基于这样的Razor视图引擎创建自定义视图引擎来完成:ASP.NET MVC:多视图文件夹和_ViewStart.cshtml文件

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(); 
    } 
} 

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

这可能吗?

谢谢

+0

为什么不使用区域而不是搞乱视图引擎? – 2013-03-07 23:00:31

+1

这绝对是可能的 - 事实上,我只是使用您提供的视图引擎在我的机器上将其复制并粘贴。 我看不到和你一样的行为。我有两个_ViewStart文件,一个在〜/ Framework/Views/_ViewStart.cshtml,另一个在〜/ Views/_ViewStart.cshtml。当我在〜/ Framework/Views /中运行视图时,它使用框架_ViewStart。当我在〜/ Views /中运行视图时,它在那里使用_ViewStart。 使用DotPeek双重检查RazorViewEngine中的代码也证实了它应该如何表现。你确定你没有错过什么吗? – 2013-03-07 23:32:44

+1

@NickAceves:谢谢你是对的。我的文件保存在错误的位置,错误文件的副本保存在正确的位置!什么是dooch!再次感谢。 (把它放在答案中,我会标记它) – hofnarwillie 2013-03-08 09:55:58

回答

6

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

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

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

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

2

_ViewStart选择是分层次的,但你已经添加~/Framework/Views平行~/Views。我不认为Razor的设置是为了实现你想要的(即两个完全平行的视图位置)。如果您要将Framework放入主Views文件夹中,则您的_ViewStart会正确加载。

+0

我看到是的。所以框架目录是这样的:'〜/ Views/Framework/_ViewStart.cshtml'和'〜/ Views/Framework/Controller/Action.cshtml'。然后自定义剃须刀视图引擎仍然需要,但将AdditionalViewLocations更改为如下所示:'“〜/ Views/Framework/{1}/{0} .cshtml”'? – hofnarwillie 2013-03-07 22:38:01

+0

或者仍然是平行视图位置?我应该只是将Framework文件夹添加为区域? (之前没有使用过区域,所以如果我误解了,很抱歉) – hofnarwillie 2013-03-07 22:48:51

+0

不,这正是我所说的。如果您将所有“框架”视图放在一个文件夹中并将“_ViewStart”放在该文件夹中,那么它将应用于该级别和下面的所有内容。把它看作是一种重载。你将不再需要一个定制的剃须刀引擎。 – 2013-03-08 15:41:02