為 Silverlight 撰寫 SharePoint 2010 人員選擇控制項
英文原文已於 2011 年 8 月 10 日星期三發佈
SharePoint 開發人員的 Silverlight 工具箱中十分缺乏人員選擇控制項方面的功能。SharePoint 中有一個控制項可以讓您用在網頁組件或自訂配置頁面 (PeopleEditor 類別) 中。儘管所有 Silverlight 程式碼都執行於用戶端上,但目前尚無任何現成的解決方法可以解決此問題。最近我有一個專案必須用到這項功能,也因此讓我發現了一個十分簡單的方法可以建立這類控制項。以下是我在 Silverlight 中實作為快顯之 No-UI-Talent 選擇器控制項的螢幕擷取畫面:
此控制項之所以能夠順利運作,得力於 SharePoint 隨附的「人員 Web 服務」。在此處我使用了稱作 SearchPrincipals 的方法擷取 [搜尋] (Search) 方塊中所輸入的文字,然後再尋找可能相符之項目的清單。我的狀況十分單純,所以我只需要找到一個使用者就可以了,但是我也可以要求群組、通訊群組清單或 SharePoint 安全性群組就是了。您也可以實作自己的輸入控制項,而讓使用者能輸入名稱,然後呼叫 Web 服務上的 ResolvePrincipals 方法。以下是一些您可能會用到有關於實作方面的詳細資訊:
- 此方法會傳回 PrincipalInfo 物件的 ObservableCollection。為使傳回的資料更易於解讀,我建立了自訂類別 PickerEntry,並在其中包含 DisplayName 與 AccountName。除此之外,PrincipalInfo 類別也包含了 Department 與 Email 屬性,我想您可能會需要用到。針對這個情況,我覆寫了類別中的 ToString() 方法,並要求其傳回 DisplayName 屬性,如此就可以取得名稱,並順利地如我所需地顯示在清單方塊中。透過這個方法,我也可判別出使用者所選的使用者帳戶名稱。
- 我希望能夠從我目前所在的 SharePoint 網站使用 Web 服務進入點,這在 Silverlight 中有一點困難,至少不是很容易理解。所幸我的這組程式碼幫我解決了這個問題:
//get info on the current host
string curUrl = HtmlPage.Document.DocumentUri.AbsoluteUri.ToString();
//get the host name; note that this assumes the user has rights to the root site
//site collection; that may not be true in your scenario
Uri curUri = new Uri(curUrl);
HostName = curUri.Scheme + "://" + curUri.Host + ":" + curUri.Port.ToString();
//use the host name property to configure the request against the site in
//which the control is hosted
PeopleWS.PeopleSoapClient ps = new PeopleWS.PeopleSoapClient();
ps.Endpoint.Address =
new System.ServiceModel.EndpointAddress(HostName + "/_vti_bin/People.asmx");
事實上這可能是唯一比較有趣的部分了。我也將這組使用者控制項的程式碼貼在本文中,但很抱歉,因為種種因素的限制,我無法加進整個專案。希望這篇文章及控制項程式碼部分對於需要這類功能的使用者助益已足。
這是翻譯後的部落格文章。英文原文請參閱 Writing A SharePoint 2010 People Picker Control for Silverlight