目前开源的CMS、Blog或者电子商务站点,他们都有一个共同的亮点,无疑就是可任意切换皮肤,并且定制和扩展能力都非常强。在这方面PHP可以说做的是最好的。那么我们如何能够在我们的ASP.NET MVC站点下面实现任意切换皮肤呢?NopCommerce—开源的 ASP.NET MVC 电子商务站点,它提供了强大的换肤功能,可通过一键切换皮肤。那接下来,我们就一起去寻找换肤的秘诀,让我们的ASP.NET MVC站点也具有一键换肤的功能吧。
换肤试用
先试用下Nop站点的换肤效果吧,打开Nop的源码,下载地址:, 按照官方的Theme制作方法:。
具体步骤戳这儿
换肤后的思考?
我们刚才制作皮肤的时候,将默认的皮肤文件夹下所有的文件拷贝到新的皮肤文件夹下面,并做了样式和HTML结构的修改。Nop应该是根据客户选择的皮肤定位到相应的皮肤文件夹下面,去找到View并加载出来。那实现换肤功能的关键就是: 根据用户选择的皮肤,ASP.NET MVC动态定位到皮肤文件夹下的View,并呈现出来。
做过ASP.NET MVC开发的朋友都知道,如果在Controller里面新建一个Action,但View不存在,页面肯定会报如下错误:
从异常信息可以看出,ASP.NET MVC内部有一种加载View的机制。如果我们能够扩展这种内部的加载View的机制,去按照我们的自定义逻辑根据不同的皮肤加载不同的View,那我们的站点就能够实现换肤功能了。实现这个功能的核心就是IViewEngine,资料介绍:。该接口定义如下(此段代码不在NopCommerce里):
1 /// <summary> 2 /// Defines the methods that are required for a view engine. 3 /// </summary> 4 public interface IViewEngine 5 { 6 /// <summary> 7 /// Finds the specified partial view by using the specified controller context. 8 /// </summary> 9 ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache); 10 /// <summary> 11 /// Finds the specified view by using the specified controller context. 12 /// </summary> 13 ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache); 14 /// <summary> 15 /// Releases the specified view by using the specified controller context. 16 /// </summary> 17 /// <param>The controller context.</param><param>The view.</param> 18 void ReleaseView(ControllerContext controllerContext, IView view); 19 }