2013-03-07 34 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