从控件开发的角度看几个editor控件,Freetextbox,radtoolbar,abouteditor,cuteeditor
首先是FreeTextbox
此控件是生成的控件(相對于復合控件),不論是toolbar還是toolbaritem,都不是以子控件的形式存在,因此有更好的性能。這種方式的缺點是,不能很好的利用現有的Asp控件,降低了用戶自定義控件的方便性。如,我想在toolbari上加上combox,必須自己實現。
視圖狀態,視圖狀態的管理是令人頭疼的問題,弄不好就會加大視圖狀態的大小。從Freetextbox對視圖狀態的實現來看,它的實現中規中矩,完全符合ms推薦的實現方式。但是,是否每個toolbaritem都有必要實行視圖狀態?其實從Freetextbox的實現分析,大部分的實現是不必要的,因為他們都不會改變。如果把這些實現剔除,Freetextbox的代碼會簡單很多。
子控件的實現方式,此控件不存在子控件,toolbaritem被定義為實現了IstateMananger的類,每個Item都是一個類,如Bold,Italic等。
總之,這個控件的服務器段代碼,十分符合MS推薦的控件實現方式,它的內部實現,類似于ASP的服務器控件實現。也符合常人的思路,代碼比較容易理解。結構也不錯可以給80分。
其次,Radtoolbar
此控件用的是復合控件。每個toolbaritem都被實現為子控件,并且暴露給客戶。從用法來看比較像asp的一些復合控件,即子控件要在aspx中聲明。但這種方式對客戶來說,用起來很不方便,因為要寫許多聲明代碼。
視圖狀態,此控件對視圖狀態的管理,可以說壞到了極點。它竟然通過把控件的屬性序列化為xml,然后把xml作為視圖狀態。這就造成,任何一個細微的改變,都會把視圖狀態項記為dirty,造成整個xml序列被序列化的客戶端。再者xml本身就包含許多不必要的文本,如<sdds>ss</sdds>。可以看到元素名稱是很浪費空間的。這就造成此控件的視圖狀態,會比標準的asp實現大十倍左右。
子控件的實現方式,子控件是通過序列化的方式從配置文件讀取。子控件沒有細分,如沒有類似于Bold,Italic的項。只被粗略分成了Toolbarbutton,toolbarseprator等。
總之,這個控件實現沒有細看,因為不論從哪方面來說,它都算不上優秀。50分。
AboutEditor
這個控件的實現類似于Freetextbox,也不是復合控件。
視圖狀態,他沒有為toolbarItem實現視圖狀態,因為這幾乎沒必要。
子控件,他同樣不存在子控件,與freetextbox的不同在于,他沒有細化每個toolbaritem。
總之,此控件和freetextbox很相似,我沒有細看。
最后是Cuteeditor
看了他的demo,很震撼,應該是所有editor中效果最好的。
Cuteeditor用復合控件實現,缺點是增加了控件樹的開銷,效率沒有生成控件高。優點就是,客戶實現自定義功能較方便。
由于用子控件,大部分視圖狀態都可以交給webcontrol管理。
他對子控件的實現我認為不算太好,簡單的控件都從一個基類派生,這點如果還算不上缺點,那么他對Forecolor等的實現方式,確實不算好。
總之cuteeditor是功能里面最強大的。但是他的實現,很難讓人理解。不像Freetextbox,有中規中矩的實現。60分。
?
看了幾個實現,可以說實現方式五花八門,除去視圖狀態不談,只要把htmlrender到客戶端,控件就算完成了。這就造成實現控件的方式很多。應該怎么寫,確實值得思考。
Freetexbox,占去了大概一周的時間,這段時間我仔細看了他最新版本,以及更早版本的代碼,它的實現和符合正常人的思路,很容易理解。對他的實現了解太多,以至于不想參考他的實現了。主要是怕寫完代碼和他特別像。從結構上來看,它的缺點我認為主要在于,把子控件的生成操作,都延遲到了父控件,造成父控件邏輯負雜。我最初的想法是,在Init的時候,構造一個xmldocument,然后每個子控件通過xml的方式,增加xmldoc的節點,最后再返回xmldoc給父控件。
Cuteeditor用了兩三天的時間,他的代碼很亂,幾乎不符合常人的思路。尤其他為了防止破解,故意調整了幾個類的順序,如Editor,嵌套了四五層的內部類,讓人看起來很頭痛。從他的html看,也不像其他控件一樣,能得到許多有用信息。
由于他的效果最好,并且我看了好久都沒有頭緒,覺定從他下手,寫一個類似的editor。
其他的幾個控件,和這兩個相比都差很遠,忽略。
經過近一個月的努力,控件開發終于過半,對cuteeditor的研究也更深入了,覺得他的許多實現確實很詭異,也讓人眼前一亮。增加到80分。
Cuteeditor特點
首先,它對資源文件的處理方式來看,他沒有采用.net的資源文件,也不是通過自己定義資源管理類來在用到資源時本地化。而是通過重寫Textwriter的innerwriter和response的filter實現。細節上,他用到了Idispose接口和using語句,這樣在緩沖去滿,或者dispose時,自動實現資源的本地化。簡直是絕了,我一直沒有想過能這樣用dispose和這樣實現資源。
其次,對事件的處理,這也是cuteeditor做的很好的地方,它把所有的postbackdate和postbackevent,封裝到了兩個隱藏域中,這兩個隱藏域是兩個webcontrol,他的值為post的數據和事件。這就使新增事件及其簡便。只要加上postback=ture,就可以處理回發。
其次,對腳本的管理,他的腳本都是動態加載的,因此不能調試。又是一個防止破解的招數。
通過httphandler,他托管了*.js的加載。
再次,配置文件的管理,他在運行時,會把幾個配置文件加載到一個xmldoc中,實現統一管理。Js也實現了類似功能。
還有,Gizip,以及緩存的管理方式,都和一般人的不同,感興趣的自己去看源碼。
類似的詭異實現還有很多。
我寫的editor,主要在下面幾點做了改進:
首先是,子控件的管理上,他的管理方式不算好。我把類似ForeColor的控件都抽出了基類。
其次,我認為應該讓客戶更簡單的自定義控件。因此在這點上也有改進。
再次,net2.0已有的功能不再自己實現,如Gizp,在2.o已經有了Gizpstream。
我希望用Ma.js重寫他的客戶端腳本,因此在服務器端盡量做些支持。
看了回復才知道還有個RadEditor,看了他的代碼和效果。發現它才是最好的。90分吧
其中,界面滿分20。cuteeditor和Radeditor都是20分。freetextbox10分
服務器端代碼部分,ce60,freetextbox70,radeditore70。滿分80
轉載于:https://www.cnblogs.com/neil-zhao/archive/2008/07/23/1250011.html
總結
以上是生活随笔為你收集整理的从控件开发的角度看几个editor控件,Freetextbox,radtoolbar,abouteditor,cuteeditor的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地下城与勇士金牌怎么得?
- 下一篇: 多囊不来月经该怎么办?如何治疗?