为Web程序实现皮肤的功能一直是一项长久不衰的话题。
实现的方法无外乎用模版引擎解析皮肤的模版生成页面。
模版引擎也是多种多样,千奇百怪。
不过我觉得Mvc自带的Razor配合Visual Studio在体验上是最爽的模版引擎。
Mvc的View解析其实就是一种模版解析行为,那么我们是否可以利用Mvc的View解析实现程序的换肤功能呢?这样就不需要在另做模版解析的工作。
下面就简单实现一个换肤的例子。
先实现一个普通的Mvc程序,然后再修改成带皮肤切换的Mvc程序。
新建一个空的Mvc3项目。
实现HomeController下的IndexAction ,并提供一些数据。
{
ViewBag.Title = " 欢迎光临博客园 ";
IList< string> news = new List< string>() {
" 系统性能优化一例 ",
" Cowboy 源码分析(五) ",
" 在ASP.NET Web Application中使用App_Code文件夹引发的异常 ",
" android自定义组件之TopMenu ",
" 使用CSS和JQuery,模拟超链接的用户单击事件 "
};
ViewBag.News = news;
return View();
}
}
新建IndexAction的View,并显示Action提供的数据。
@ViewBag.Title
</ h1 >
< ul >
@foreach (string str in ViewBag.News)
{
< li >@str </ li >
}
</ ul >
项目的结构
项目运行结果:
到此一个普通的mvc程序就完了,下面我们再实现换肤功能。
修改_ViewStart.cshtml 文件如下。
Layout = " Shared/_Layout.cshtml ";
}
在View目录下新建一个Skins目录,用于存放皮肤文件。
在Skins目录下新建两个皮肤目录,绿衣盎然,红妆素裹。并把原View目录下除Web.config外的文件所有文件分别复制到这两个目录下。
然后分别为两套皮肤的_Layout.cshtml,加上不同的样式。
红妆素裹 _Layout.cshtml
*
{
color: Red;
}
</style>
绿意盎然 _Layout.cshtml
*
{
color: Green;
}
</style>
此时运行项目肯定是报错的,提示找不到视图文件。
下面我们就通过修改View的搜寻路径,实现模版的切换。
修改Global.asax文件。
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
RegSkin( " 绿衣盎然 "); // 修改皮肤名换肤
}
public static void RegSkin( string skinName)
{
RazorViewEngine engine = ViewEngines.Engines.Where(e => e is RazorViewEngine).Single() as RazorViewEngine;
engine.ViewLocationFormats = engine.PartialViewLocationFormats = engine.MasterLocationFormats = new string[]{
" ~/Views/Skins/ "+skinName+ " /{1}/{0}.cshtml ",
" ~/Views/Skins/ "+skinName+ " /{1}/{0}.vbhtml ",
" ~/Views/Skins/ "+skinName+ " /{1}/Shared/{0}.cshtml ",
" ~/Views/Skins/ "+skinName+ " /{1}/Shared/{0}.vbhtml ",
" ~/Views/{1}/{0}.cshtml ",
" ~/Views/{1}/{0}.vbhtml ",
" ~/Views/Shared/{0}.cshtml ",
" ~/Views/Shared/{0}.vbhtml "
};
}
至此换肤功能已经完成。