Widget小工具
上篇文章我向大家介紹了BlogEngine.Net中開發擴展的重要一部分——Extension。在本文中我將向大家展示它的另外一種擴展特性,那就是Widget小工具,主要是Widget的開發標准和工作原理等。
什麼是Widget與為什麼要使用Widget
Widget實際上就是一種帶有界面的小工具,主要應用在桌面領域,例如:Yahoo!Widget,還有Vista自帶的邊欄等。在BlogEngine.Net中它就是頁面左側或右側的那種小的分區,例如Category list,Calendar,Tag cloud等,這種東西實際上在很多Blog系統中都存在,在BlogEngine.Net中我們就叫它Widget。
Widget可以將Blog系統中很多的功能提供給用戶一個統一的界面訪問接口。如果有一些功能需要加到頁面上,我們首先考慮的就是可否作成一個Widget來實現,因為這種Widget具有統一的開發標准,可以很方便的達到我們的目的。
WidgetBase和WidgetEditBase
在BlogEngine.Net中,作為一個有界面的Widget我們只需要繼承WidgetBase類就行了。WidgetBase直接繼承了UserControl,重寫了Render用來生成統一的Widget界面,至於具體Widget中顯示什麼,則由自定義Widget類本身來完成,WidgetBase中有一個抽象方法LoadWidget用來完成Widget對象的初始化工作,IsEditable用於說明Widget是否可以編輯,如果可以編輯在Render時就會輸出編輯按鈕,那麼這個Widget也必須提供一個編輯界面(繼承了WidgetEditBase)。此外還需要注意WidgetBase中GetSettings會根據WidgetID從DataStore(前文講述過)中獲得相應的配置信息(也就是內容信息)並存儲在Cache中。Cache在這部分的DataStore的處理中運用很多,希望大家留意。
如果某個Widget可以編輯,那麼它還需要一個實現WidgetEditBase的類,這個類主要是給用戶提供一個對於Widget配置信息(具體內容)修改的界面,它提供了一個抽象的Save方法用於將修改的信息保存到DataStore中,還有一個Saved事件用於外部監聽以便進行擴展。
所有已經實現的Widget必須放在widgets目錄下,並以Widget的名稱給相應的文件夾命名,如果只是浏覽我們加入一個widget.ascx就行了,如果需要修改還需要加入一個edit.ascx,以TextBox(可以設置一些關於作者的描述信息)的實現為例:
在widgets\TextBox中有widget.ascx和edit.ascx兩個文件(加上Codebehind一共四個),在widget.ascx.cs的LoadWidget(重寫父類的方法)獲得DataStore信息並加入到Widget內容中。
1/**//// <summary>
2/// This method works as a substitute for Page_Load. You should use this method for
3/// data binding etc. instead of Page_Load.
4/// </summary>
5public override void LoadWidget()
6{
7 StringDictionary settings = GetSettings();
8 if (settings.ContainsKey("content"))
9 {
10 LiteralControl text = new LiteralControl(settings["content"]);
11 this.Controls.Add(text);
12 }
13}
14
15/**//// <summary>
16/// Gets the name. It must be exactly the same as the folder that contains the widget.
17/// </summary>
18/// <value></value>
19public override string Name
20{
21 get { return "TextBox"; }
22}
23
24/**//// <summary>
25/// Gets wether or not the widget can be edited.
26/// <remarks>
27/// The only way a widget can be editable is by adding a edit.ascx file to the widget folder.
28/// </remarks>
29/// </summary>
30/// <value></value>
31public override bool IsEditable
32{
33 get { return true; }
34}
35