以前看過DotNetNuke 4(以下簡稱DNN)的部分源碼,作為一個CMS它的實現無疑有很多值得借鑒的地方。個人比較注重頁面的呈現部分,所以特別關注其中的換膚、布局等部分,雖然DNN的這方面的實現已經十分優秀,但是我認為還是有改進的地方的,這也是本文要介紹的主要內容:布局設計器!
那DNN在皮膚/布局方面到底有什麼不好的呢?那就是,使用者不能很方便地添加新的皮膚!要添加新的皮膚,只能是Web開發/設計人員設計添加新的使用者控制項(.ASCX,這是DNN皮膚的實現機制),並將相關的圖片檔案拷貝到Portals\*\Skins目錄下,如果網站沒有提供相關的上傳功能的話,這項工作只能由管理員進行;而且修改起來也特別不方便,可能還需要重新上傳。如果能夠線上修改皮膚的布局和內容,那豈不是完美了嗎?!
為了達到以上目的,DNN那種將皮膚實現為“靜態”的ascx形式顯然不可取!大家知道,DNN的頁面是通過將模組拖到指定皮膚上形成的,那麼我們就模仿這種方式,就是說:皮膚是通過將模組拖放到一個空白頁面形成的,這個空白頁面已經由布局設計器拆分成特定的布局,如DNN內定的“三行,中間行分為三列”的標準布局(不知道怎麼描述,大家能看懂嗎?我駕馭文筆的能力比較差的說!),當然,皮膚中應該留出一個或多個空白地區,讓具體頁面放置它們各自的內容。
如果理解了上面的描述的話,那麼毫無疑問,第一步需要將空白頁面拆成N個地區,然後才能往各個地區拖放模組形成皮膚。舉個例子,我們將頁面分成三行,然後往第一行和最後一行放置一個Html模組(看過DNN的人都應該知道這個模組的作用吧?!),然後編輯第一行的Html模組形成頁頭,編輯最後一行的Html模組形成頁尾,哈哈,一個擁有頁頭、頁尾,中間有個空白地區的皮膚就形成了!
目前我已經把布局編輯器封裝成一個伺服器端控制項,利用ASP.NET 2.0引入的Callback特性,達到類似ajax的效果,示範如下:
結合布局設計器以及ASP.NET WebPart架構,我做了一個基本可用的例子,證明其可行性,下面是簡單拆分成兩列的效果(嘻嘻,好像醜了點,畢竟我不是美工,沒有任何加工的嘛):
P.S. 以上均為個人學習研究結果,可能用於公司項目,不提供源碼下載,不過實現也不複雜,想想我都能作,可見是多麼簡單啦,呵呵~~~