网站模块:模板切换
开发网站,我们常常需要切换模板来实现界面风格的变化。在NopCommerce中,Themes模块写得非常复杂。其实通过自定义RazorViewEngine就仅仅修改几个特定的字符串数组就可以实现!
(1)在web.config的appsettings中定义一个模板名的设置
<appSettings>
.......
<add key="TemplateName" value=""/>
</appSettings>
(2)创建自定义RazorViewEngine类
public class TestRazorViewEngine : RazorViewEngine
{
public TestRazorViewEngine(string theme)
{
if (string.IsNullOrEmpty(theme))
{
AreaViewLocationFormats = new[]
{
//themes
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.cshtml",
};
AreaMasterLocationFormats = new[]
{
//themes
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.cshtml",
};
AreaPartialViewLocationFormats = new[]
{
//themes
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.cshtml",
};
ViewLocationFormats = new[]
{
//themes
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.cshtml",
};
MasterLocationFormats = new[]
{
//themes
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.cshtml",
};
PartialViewLocationFormats = new[]
{
//themes
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.cshtml",
};
}
else
{
AreaViewLocationFormats = new[]
{
//themes
"~/Areas/{2}/Themes/"+theme+"/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Themes/"+theme+"/Views/Shared/{0}.cshtml",
};
AreaMasterLocationFormats = new[]
{
//themes
"~/Areas/{2}/Themes/"+theme+"/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Themes/"+theme+"/Views/Shared/{0}.cshtml",
};
AreaPartialViewLocationFormats = new[]
{
//themes
"~/Areas/{2}/Themes/"+theme+"/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Themes/"+theme+"/Views/Shared/{0}.cshtml",
};
ViewLocationFormats = new[]
{
//themes
"~/Themes/"+theme+"/Views/{1}/{0}.cshtml",
"~/Themes/"+theme+"/Views/Shared/{0}.cshtml",
};
MasterLocationFormats = new[]
{
//themes
"~/Themes/"+theme+"/Views/{1}/{0}.cshtml",
"~/Themes/"+theme+"/Views/Shared/{0}.cshtml",
};
PartialViewLocationFormats = new[]
{
//themes
"~/Themes/"+theme+"/Views/{1}/{0}.cshtml",
"~/Themes/"+theme+"/Views/Shared/{0}.cshtml",
};
}
FileExtensions = new[] { "cshtml" };
}
}
(3)在网站启动时引用自定义的RazorViewEngine
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
var theme = ConfigurationManager.AppSettings["TemplateName"];
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new TestRazorViewEngine(theme));
.......
}
}