DNN中的Skinning系统

Skinning早有耳闻。但很汗的是,DNN才是我接触过的第一个采用Skinning的项目。所谓Skinning就是实现功能和外观的分离。但由于接触Asp.net不多。看了挺长时间DNN了,现在才对整个Skinning系统有了一定的理解。

DNN中,所谓的皮肤由两部分组成。即skincontainer。由于这是DNN的标志性功能。对这些讲解的文章很多。在/Documents/DotNetNuke Skinning中,我觉得讲的已经足够清楚了。我想写的是整个页面的绘制过程。

1.            首先,从键入一个Url开始。这个Url将会被UrlRewriteModule类率先获得。并利用Asp.net所支持的Url重写系统对一个Url进行重写。我一直对这个重写机制有着很多的疑问。但在看完后,很多疑问都得以解决。推荐和我一样对Url重写不大了解的人看下这篇文章。DNNUrl重写几乎是按照这篇文章的标准格式完成的。

2.            重写完毕的Url将被定位到一个页面上,一般是Default.aspx页面。这个页面的后台类是Cdefault。这个类的LoadSkin方法将加载skin。Skin的路径一般会在PortalSettings.ActiveTab.SkinSrc中。Tab才是真正的页面标示,因为几乎所有的页面都是在Default.aspx上动态绘制,只有通过Tab来区分。在数据库中,我们可以看到Tabs中存放着skinsrc和containersrc。在TabModules中,保存着每一个Tab的模块及其位置。

3.            在每一个Skin,即每一个Skin.ascx的后台类都是Skin。它会取出所有页面上ID为contentpane,leftpane,rightpane,topane,bottompane。的td,span,div,p。(ID必须唯一)并取出相应的container放进去。并且在每个container中ID为contentpane的控件上放入相应的module。这样就绘制出了整个页面。

原来我以为会在Default.aspx的后台类中加载skin,container,module。但它只在其中完成了skin的加载,大部分的功能都在skin.ascx的后台类中完成。我想这样设计自然会有它的理由。也许是为了集中控制。希望能听到高人的理解。

给我最大的启发就是要想实现功能部件的分离,和动态的组装。必须有一定的语法规则。就是通过彼此都默认的字串把各部件联系在一起。同时还要有从字串生成对象或是调用功能的能力。从skinning中可以看到。类似于Contentpane这样命名规则必须遵守,同时还要有Loadcontrol(controlpath as string) as usercontrol这样由字串直接加载成控件的能力。在.net中提供了很多这样的机制,如反射。这种机制的引入,通常会提高灵活性,但也免不了会付出一些代价,使用时要根据需求,权衡利弊。

posted on 2006-02-19 20:49  duguguiyu  阅读(451)  评论(0编辑  收藏  举报

导航