2012-01-30 58 views
2

我想添加主題到我的網站,將使用完全不同的視圖。我希望看到他們在我的項目是這樣的:asp.net mvc 3,主題(不同視圖)

Views/Theme1/... 
Views/Theme2/... 

,而不是默認

Views/... 

堂妹和我需要一個簡單的方法在它們之間進行切換。

所以問題是:我如何讓ViewEngine在提到的特定位置查找視圖,例如,在web.config中?

新增

解決基本問題,這一點,THX到阿爾奇爾:

public class ThemedRazorViewEngine : RazorViewEngine 
{ 
    public ThemedRazorViewEngine(string themeName) 
    { 
     MasterLocationFormats = new string[] { "~/Views/" + themeName + "/Shared/{0}.cshtml" }; 
     PartialViewLocationFormats = new string[] { "~/Views/" + themeName + "/{1}/{0}.cshtml" }; 
     ViewLocationFormats = new string[] { "~/Views/" + themeName + "/{1}/{0}.cshtml" }; 
    } 
} 

一切都不錯,但 「右鍵 - >去查看」 不工作的話(側效果,沒什麼大不了的)。

現在我想出了另一個問題:在網站上我們有管理小組應該是獨立於主題的。我該如何解決這個問題?有這樣的事情:

Views/Admin/... 
Views/Theme1/... 
Views/Theme2/... 

回答

2
在web.config中的主題值

簡單的方法是創建自定義ViewEngine並僅覆蓋查看搜索位置。你不要這樣,在控制器的任何改變(例只使用CSHTML文件C#僅視圖引擎,你有,如果你想使用Visual Basic的意見添加vbhtml擴展)

public class ThemedRazorViewEngine : RazorViewEngine 
{ 
    public ThemedRazorViewEngine(string themeName) 
    { 
     AreaMasterLocationFormats = new string[] { "~/Areas/{2}/Views/ " + themeName + "/{1}/{0}.cshtml", "~/Areas/{2}/Views/Shared/" + themeName + "/{0}.cshtml" }; 

     //and same for all of below 
     AreaPartialViewLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.cshtml" }; 
     AreaViewLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.cshtml" }; 
     FileExtensions = new string[] { "cshtml" }; 
     MasterLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" }; 
     PartialViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" }; 
     ViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" }; 
    } 
} 

和查看引擎的註冊

ViewEngines.Engines.Clear(); 
ViewEngines.Engines.Add(new ThemedRazorViewEngine(ConfigurationManager.AppSettings["currentTheme"])); 
+0

thx,它的工作。必須修復'_ViewStart'文件。這些地區是什麼?它的工作原理沒有改變。是否有可能通過此解決方案進行「右鍵單擊 - >去查看」工作? – Wonder 2012-01-30 18:57:57

+0

@想知道如果這對你有幫助,你應該考慮將它標記爲答案。看看這個鏈接的區域 - http://msdn.microsoft.com/en-us/library/ie/ee671793.aspx – archil 2012-01-31 10:18:51

2

我怎樣才能使視圖引擎來尋找提到一個特定的地方 意見。

你需要給在查看方法路徑:

return View("~/Views/Theme1/Index"); 
return View("~/Views/Theme2/Index"); 

而對於web.config例如:

var themeFromWebConfig = GetThemeFromWebConfig(); 
var viewName = "~/Views/" + themeFromWebConfig + "/Index"; 
return View(viewName); 
+0

這是我首先想到的,但它看起來並不是最清晰的解決方案。我不想將這添加到每個視圖,我正在尋找一個特定的地方,我可以提一次。 – Wonder 2012-01-30 09:20:10

+0

@Wonder。你可以用它編寫你自己的'ViewEngine'好運... ** =)** – gdoron 2012-01-30 09:21:20

+0

是啊,似乎我需要的是一些幫助使'公共類MyViewEngine:RazorViewEngine' – Wonder 2012-01-30 09:32:02