Artículo original publicado el miércoles, 10 de agosto de 2011

Una de las piezas que los desarrolladores de SharePoint más echan en falta en el cuadro de herramientas de Silverlight es un control de selector de personas. Hay un control que proporciona SharePoint, que se puede utilizar en un elemento web o en una página de diseños personalizado (la clase PeopleEditor). Sin embargo, el código de Silverlight se ejecuta por completo en la parte del cliente, de modo que no hay una solución lista para usar para este asunto. Yo necesitaba realmente esta funcionalidad en un proyecto reciente y acabé por encontrar una manera bastante sencilla de crearla.  He aquí una captura de pantalla de mi selector de control (admito que no tengo demasiado talento con la IU), implementado como ventana emergente en Silverlight:

 

 

La clave para hacer que esto funcione reside en un pequeño servicio web que SharePoint ofrece listo para usar llamado "People web service". En este caso utilicé un método denominado SearchPrincipals para tomar el texto que se escribió en el cuadro de búsqueda y buscar una lista de coincidencias posibles. Mi caso era sencillo ya que solo necesitaba encontrar a un solo usuario. No obstante, también podría consultar grupos, listas de distribución o grupos de seguridad de SharePoint. También puede implementar su propia versión del control de tecleo permitiendo a alguien escribir el nombre y después llamando al método ResolvePrincipals en el servicio web. He aquí algunos detalles de implementación que podrían resultarle interesantes:

 

  • El método devuelve una colección ObservableCollection de objetos PrincipalInfo. Para que fuera más fácil utilizarlo, creé una clase personalizada llamada PickerEntry que contenía un DisplayName y un AccountName. La clase PrincipalInfo también incluye propiedades para el departamento y el correo electrónico; puede que sea útil para usted también.  En este caso en particular, invalidé el método ToString() de mi clase e hice que devolviera la propiedad DisplayName; así es como obtuve los nombres que se muestran de forma deseada en el cuadro de lista. Es así, también, como determiné cuál es el nombre de cuenta del usuario seleccionado cuando está seleccionado.
  • Quería poder utilizar el punto de entrada del servicio web desde el sitio SharePoint en el que estaba en ese momento. Eso fue algo más difícil, o al menos no evidente, de hacer desde Silverlight. Afortunadamente, pude solucionarlo con este código:

 

//obtener información sobre el host actual

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

 

//obtener el nombre de host; tenga en cuenta que esto da por hecho que el usuario tiene derecho a acceder al sitio raíz

//colección del sitio; podría no aplicarse en su escenario

Uri curUri = new Uri(curUrl);

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

 

//utilice la propiedad del nombre de host para configurar la solicitud en el sitio en

//el que está hospedado el control

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

ps.Endpoint.Address =

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

 

En realidad, probablemente esa sea la única parte particularmente interesante. En esta entrada, he adjuntado el código del control de usuario. Lamentablemente, por varias razones no puedo incluir todo el proyecto, aunque espero que esta entrada y el propio código de control sean suficientes para que pueda adelantar camino, en el caso de que lo necesite.

Esta entrada de blog es una traducción. Puede consultar el artículo original en Writing A SharePoint 2010 People Picker Control for Silverlight