2012-12-12 83 views
3

我正在爲設計用於服務兩個域的MVC4應用程序工作。我們的大部分內容將在各個域中共享,但有時我們需要根據請求來自哪個網站呈現不同的標記(使用Razor)。MVC4剃刀自定義查看定位器

理想情況下,我想基於慣例的方法,讓我有一個文件夾結構是這樣的:

Views 
+ Domain1 
    + ControllerName 
     View1 
     View2 
+ Domain2 
    + ControllerName 
     View1 
+ ControllerName 
    View1 
    View2 

在解決一個觀點,我想首先檢查特定於域的文件夾,然後將一般視圖文件夾。

我的第一個想法是實現一個繼承RazorViewEngine的自定義視圖引擎,它將根據請求域交換ViewLocationFormats字符串。不幸的是,所有這些東西都被埋在了VirtualPathProviderEngine中,不能被覆蓋。

回答

9

事實證明,答案是創造知道該域特定文件夾的每個域的自定義視圖引擎(從RazorViewEngine繼承):

public class Domain1ViewEngine() : RazorViewEngine 
{ 
     ... 

     ViewLocationFormats = new[] 
     { 
      "~/Views/Domain1/{1}/{0}.cshtml", 
      "~/Views/Domain1/Shared/{0}.cshtml" 
     }; 

     ... 
} 

然後我要重寫FindViewFindPartialView方法,所以它只能試圖找到定位的看法,如果請求都來自權域:

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
{ 
    if ([THIS IS NOT THE RIGHT DOMAIN]) 
    { 
     return new ViewEngineResult(new string[] { }); 
    } 

    return base.FindView(controllerContext, viewName, masterName, useCache); 
} 

要完成我註冊的視圖引擎Global.asax.cs以通常的方式的過程:

protected void Application_Start() 
{ 
    ViewEngines.Engines.Clear(); 
    ViewEngines.Engines.Add(new Domain1ViewEngine()); 
    ViewEngines.Engines.Add(new RazorViewEngine()); 
} 
+0

雖然我一直在尋找,並且實施了類似於[this](http://lonetechie.com/2012/09/25/multi-tenant-architecture-with -asp-net-mvc-4 /),所以你只需要一個自定義視圖引擎。如果您沒有在特定域下使用或具有特定視圖的文件夾,則它只會回退到默認視圖。 – Crob