다음을 통해 공유


编写用于 Silverlight 的 SharePoint 2010 人员选取器控件

原文发布于 2011 年 8 月 10 日(星期三)

SharePoint 开发人员的 Silverlight 工具箱中非常缺少的部件之一是人员选取器控件。SharePoint 提供有一个控件,可在 Web 部件或自定义布局页中(PeopleEditor 类)中使用它。由于 Silverlight 代码全部在客户端执行,因此没有针对这一情况提供现成的解决方案。我最近的一个项目确实需要此功能,最终我发现了一种相当简单的方法来生成此类内容。下面是我的明显没有 UI 功能的选取器控件的屏幕截图,它是作为 Silverlight 中的弹出菜单实现的:

 

 

解决此问题的关键是 SharePoint 内置的一种讨人喜欢的 Web 服务,称为人员 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 以查看原文