网站模块:模板切换

吾心依旧 / 2023-08-30 / 原文

  开发网站,我们常常需要切换模板来实现界面风格的变化。在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));

.......

}


}