有時候我們需要開發自訂的SearchBox來代替Sharepoint網站的MasterPage預設的SearchBox,這就需要用到的Delegate Controls相關知識。Sharepoint的Delegate Control就像一個容器,它封裝了各種預設的控制項在裡面。這些控制項可以被使用者開發的自訂控制項進行替換,從而達到使用者自訂的功能和效果。
SharePoint 提供了不少的delegate controls:
•AdditionalPageHead
•GlobalSiteLink0
•GlobalSiteLink1
•GlobalSiteLink2
•PublishingConsole
•QuickLaunchDataSource
•SmallSearchInputBox
•TopNavigationDataSource
下面是Sharepoint Fundation的MasterPage定義的一些Delegate Controls
<SharePoint:DelegateControl runat="server" ControlId="AdditionalPageHead"
AllowMultipleControls="true"/>
<SharePoint:DelegateControl runat="server" ControlId="GlobalNavigation" />
<SharePoint:DelegateControl runat="server" ID="GlobalDelegate0" ControlId="GlobalSiteLink0" />
<SharePoint:DelegateControl ControlId="GlobalSiteLink2" ID="GlobalDelegate2" Scope="Farm"
runat="server" />
<SharePoint:DelegateControl runat="server" ControlId="PublishingConsole"
Id="PublishingConsoleDelegate">
</SharePoint:DelegateControl><SharePoint:DelegateControl ControlId="GlobalSiteLink3" Scope="Farm"
runat="server" />
<SharePoint:DelegateControl runat="server" ControlId="SmallSearchInputBox" Version="4" />
<SharePoint:DelegateControl runat="server" ControlId="TopNavigationDataSource"
Id="topNavigationDelegate"/>
上面所列舉的Delegate controls可以在運行時被使用者自訂的控制項或Feature動態替換。我們這裡所需要實現的建立自訂SearchBox功能就需要通過用我們自行開發的MySearchBox使用者控制項代替 Small Search Input box這個delegate control來實現。
讓我們來看一看delegate control 的XML schema
<?xml version="1.0" encoding="utf-8" ?> <Elements xmlns="http://schemas.microsoft.com/sharepoint/"><Control Id="SmallSearchInputBox" Sequence="100" ControlSrc="/templates/mysearchcontrol.ascx"/></Elements>
從上面的schema,我們可以看出,delegate control的重要屬性包括 Control Id, Sequence 和 ControlSrc.
Control Id 是我們用來識別Delegate control的
Sequence number 是我們用來定位Delegate control的等級的,它的值越小則等級越高。
ControlSrc 則用來指明Delegate Control的控制項資源的位置的。
關於SequenceNumber我們可以進一步用圖示說明
在的樣本中,針對同一Delegate control我們定義了3個使用者控制項並通過3個Feature(A,B,C)來啟用它們,但注意,它們有不同的Sequence(A>C>B),所有這3個user control都會被用來代替那個指定的Delegate Control,但由於Feature B的Sequence Number最小,所以,Feature B中的usercontrol在Runtime的時候會取得最終的代替權,並被Render到Page中呈現出來。但是,當Feature B被停止時,Feature C就會頂替上來,因為Feature C中的Sequence僅次於Feature B,當Feature B被停止後,Feature C就成了最小的了,所以,它就會取得最終的勝利。
下面我們還列出了一些在Sharepoint的LAYOUTS目錄下用到了Delegate Control頁面。也就是說,當你修改了某些Delegate Control時,下面的某些用到了此Delegate Control的頁面也會受到影響。
•AddNavigationLinkDialog.aspx: ControlId=”AddNavigationLinkDialogPanel1″ Scope=”Site”
•AddNavigationLinkDialog.aspx: ControlId=”AddNavigationLinkDialogPanel2″ Scope=”Web”
•AreaNavigationSettings.aspx: ControlId=”NavigationSettingsPanel1″ Scope=”Site”
•AreaNavigationSettings.aspx: ControlId=”NavigationSettingsPanel2″ Scope=”Web”
•BackLinks.aspx: ControlId=”SmallSearchInputBox”
•ExcelProfilePage.aspx: ControlId=”VariationsFlagControl”
•ExcelProfilePage.aspx: ControlId=”GlobalSiteLink1″ Scope=”Farm”
•ExcelProfilePage.aspx: ControlId=”GlobalSiteLink2″ Scope=”Farm”
•groups.aspx: ControlId=”QuickLaunchDataSource”
•listcontentsources.aspx: ControlId=”QuickLaunchDataSource”
•listservernamemappings.aspx: ControlId=”QuickLaunchDataSource”
•logsummary.aspx: ControlId=”QuickLaunchDataSource”
•logviewer.aspx: ControlId=”QuickLaunchDataSource”
•managecrawlrules.aspx: ControlId=”QuickLaunchDataSource”
•managefiletypes.aspx: ControlId=”QuickLaunchDataSource”
•manageprivacypolicy.aspx: ControlId=”QuickLaunchDataSource”
•manageservicepermissions.aspx: ControlId=”QuickLaunchDataSource”
•mycontactlinks.aspx: ControlId=”ColleaguesLink1″ Scope=”Farm”
•newsbweb.aspx: ControlId=”CreateSitePanel1″ Scope=”Site”
•people.aspx: ControlId=”QuickLaunchDataSource”
•personalsites.aspx: ControlId=”QuickLaunchDataSource”
•profmain.aspx: ControlId=”QuickLaunchDataSource”
•quicklinks.aspx: ControlId=”AddColleaguesLink1″ Scope=”Farm”
•regionalsetng.aspx: ControlId=”RegionalSettingsExtensions”
•schema.aspx: ControlId=”QuickLaunchDataSource”
•scsignup.aspx: ControlId=”CreateSiteCollectionPanel1″ Scope=”Farm” />
•searchsspsettings.aspx: ControlId=”QuickLaunchDataSource”
•SiteManager.aspx: ControlId=”GlobalSiteLink1″ Scope=”Farm”
•SiteManager.aspx: ControlId=”GlobalSiteLink2″ Scope=”Farm”
•user.aspx: ControlId=”QuickLaunchDataSource”
•userdisp.aspx: ControlId=”ProfileRedirection” Scope=”Farm”
•VersionDiff.aspx: ControlId=”SmallSearchInputBox”
•viewlsts.aspx: ControlId=”QuickLaunchDataSource”
•viewscopes.aspx: ControlId=”QuickLaunchDataSource”
•XLViewer.aspx: ControlId=”GlobalSiteLink1″ Scope=”Farm”
•XLViewer.aspx: ControlId=”GlobalSiteLink2″ Scope=”Farm”
有了上面的知識準備,回到本文的目標,建立一個使用者自訂的SearchBox。
首先建立一個新的項目,在此項目裡添加一個新的使用者控制項,在此使用者控制項中拖放一個日曆控制項,我們就用此日曆控制項來樣本如何代替預設的SearchBox控制項。
項目如
然後,我們需要在系統中添加一個Feature,命名此Feature如下
在此Feature中,我們定義了Scope的範圍是網站的層級的,那就意味著你整個網站頁面中的搜尋控制項都會被替換為你自己定製的樣式。
接下來,我們需要新添加一個Elment.xml,如。
需要注意的是,Sequence屬性的值一定要小於預設提供的,這個Sequence的值在wss中是100,在moss標準版中是50,企業版是25。
在MOSS的安裝目錄下搜尋指定feature中對應的xml檔案,開啟它可以看到裡面所定義的Sequence值(名字:SearchArea.xml)。
最後,編譯部署,開啟我們的測試網站可以看到效果如.