天天看點

DNN中的Skinning系統

對Skinning早有耳聞。但很汗的是,DNN才是我接觸過的第一個采用Skinning的項目。所謂Skinning就是實作功能和外觀的分離。但由于接觸Asp.net不多。看了挺長時間DNN了,現在才對整個Skinning系統有了一定的了解。

在DNN中,所謂的皮膚由兩部分組成。即skin和container。由于這是DNN的标志性功能。對這些講解的文章很多。在/Documents/DotNetNuke Skinning中,我覺得講的已經足夠清楚了。我想寫的是整個頁面的繪制過程。

1.            首先,從鍵入一個Url開始。這個Url将會被UrlRewriteModule類率先獲得。并利用Asp.net所支援的Url重寫系統對一個Url進行重寫。我一直對這個重寫機制有着很多的疑問。但在看完後,很多疑問都得以解決。推薦和我一樣對Url重寫不大了解的人看下這篇文章。DNN的Url重寫幾乎是按照這篇文章的标準格式完成的。

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中提供了很多這樣的機制,如反射。這種機制的引入,通常會提高靈活性,但也免不了會付出一些代價,使用時要根據需求,權衡利弊。

本文轉自 duguguiyu 51CTO部落格,原文連結:http://blog.51cto.com/duguguiyu/362841,如需轉載請自行聯系原作者

下一篇: Java枚舉