Écriture d’un contrôle de sélection de personnes SharePoint 2010 pour Silverlight

Article d’origine publié le mercredi 10 août 2011

S’il est un élément qui fait cruellement défaut dans la boîte à outils Silverlight pour développeurs SharePoint, c’est bien un contrôle de sélection de personnes. SharePoint fournit un contrôle que vous pouvez utiliser dans un composant WebPart ou une page de disposition personnalisée (classe PeopleEditor). Toutefois, étant donné que le code Silverlight s’exécute entièrement côté client, il n’existe pas de solution prête à l’emploi pour résoudre ce problème. Devant l’absolue nécessité de disposer de cette fonctionnalité dans le cadre d’un projet récent, j’ai fini par trouver un moyen relativement simple de créer une telle chose. Voici une capture d’écran de mon contrôle de sélection (qui, il est vrai, n’a rien d’exceptionnel du point de vue graphique), implementé sous forme de fenêtre automatique dans Silverlight :

 

 

L’élément essentiel pour faire fonctionner ce contrôle est un petit service Web sympathique et prêt à l’emploi fourni avec SharePoint appelé service Web Personnes. Dans ce cas, j’ai utilisé une méthode appelée SearchPrincipals pour extraire le texte tapé dans la zone de recherche et obtenir ensuite une liste de correspondances possibles. Dans mon cas, j’avais simplement besoin de rechercher un seul et même utilisateur. Toutefois, j’aurais pu aussi rechercher des groupes, des listes de distribution ou des groupes de sécurité SharePoint. Vous pouvez vous aussi implémenter votre propre version du contrôle textuel en permettant à quiconque de taper un nom et d’appeler la méthode ResolvePrincipals du service Web. Voici quelques détails d’implémentation qui pourraient vous être utiles :

 

  • La méthode renvoie une collection ObservableCollection d’objets PrincipalInfo. Pour la rendre plus conviviale, j’ai créé une classe personnalisée appelée PickerEntry qui contenait les éléments DisplayName et AccountName. La classe PrincipalInfo comporte également des propriétés pour Department (Service) et Email (Adresse de messagerie), qui peuvent aussi vous être utiles. Dans ce cas précis, j’ai remplacé la méthode ToString() dans ma classe et lui ai fait renvoyer la propriété DisplayName, ce qui a permis d’afficher les noms comme souhaité dans la zone de liste. C’est aussi de cette façon que j’ai pu déterminer quel était le nom de compte de l’utilisateur sélectionné.
  • Je souhaitais pouvoir utiliser le point d’entrée du service Web à partir du site SharePoint sur lequel je me trouvais. Cette tâche était un peu plus délicate, ou du moins pas évidente, à réaliser à partir de Silverlight. Heureusement, j’ai réussi à en venir à bout grâce à ce code :

 

//obtention des informations sur l’hôte actuel

string curUrl = HtmlPage.Document.DocumentUri.AbsoluteUri.ToString();

 

//obtention du nom d’hôte ; à noter que cela suppose que l’utilisateur dispose de droits sur le site racine

//collection de sites ; cela n’est peut-être pas le cas dans votre scénario

Uri curUri = new Uri(curUrl);

HostName = curUri.Scheme + "://" + curUri.Host + ":" + curUri.Port.ToString();

 

//utilisation de la propriété de nom d’hôte pour configurer la demande sur le site

//où le contrôle est hébergé

PeopleWS.PeopleSoapClient ps = new PeopleWS.PeopleSoapClient();

ps.Endpoint.Address =

new System.ServiceModel.EndpointAddress(HostName + "/_vti_bin/People.asmx");

 

À vrai dire, il s’agit probablement de la seule partie particulièrement intéressante. Je joins à ce billet le code du contrôle utilisateur. Hélas, pour diverses raisons, je ne suis pas en mesure d’inclure le projet entier. Mais j’espère que ce billet et le code du contrôle proprement dit suffiront à vous mettre sur la voie au cas où vous auriez besoin de quelque chose d’équivalent.

Ce billet de blog a été traduit de l’anglais. Vous trouverez la version originale sur Writing A SharePoint 2010 People Picker Control for Silverlight.