2012-01-30 75 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