Escrevendo um controle seletor de pessoas do SharePoint 2010 para Silverlight

Artigo original publicado quarta-feira, dia 10 de agosto de 2011

Uma das partes que mais fazem falta no kit de ferramentas do Silverlight para desenvolvedores SharePoint é um controle seletor de pessoas. Há um controle fornecido pelo SharePoint, que pode ser usado em uma web part ou uma página de layouts personalizados (a classe PeopleEditor). No entanto, o código o Silverlight é executado completamente no lado do cliente e, por isso, não há uma solução original para isso. Eu realmente precisei dessa funcionalidade em um projeto recente e acabei descobrindo uma maneira bastante simples de criar algo exatamente assim. Veja uma captura de tela de meu controle seletor No-UI-Talent, implementado como um pop-up no Silverlight:

 

 

A chave para fazer isso funcionar é um pequeno serviço Web que acompanha o SharePoint chamado de People web service. Nesse caso, usei o método chamado SearchPrincipals para pegar o texto digitado na caixa Search e encontrar uma lista de correspondências possíveis. No meu caso simples, precisei apenas encontrar um e somente um usuário. No entanto, eu também poderia ter pedido para grupos, listas de distribuição ou grupos de segurança do SharePoint. Também é possível implementar sua própria versão do controle com digitação, permitindo que alguém digite um nome e chamando o método ResolvePrincipals no serviço Web. Veja alguns detalhes da implementação que talvez você considere interessantes:

 

  • O método retorna um ObservableCollection de objetos PrincipalInfo. Para simplificá-lo eu criei uma classe personalizada chamada PickerEntry que continha um DisplayName e AccountName. A classe PrincipalInfo também inclui propriedades para Departamento e E-mail, para que também tenha utilidade a você. Nesse caso específico, substitui o método ToString() em minha classe e fiz com que retornasse a propriedade DisplayName, que foi como fiz os nomes aparecerem conforme o desejado na caixa de listagem. Foi assim também que determinei qual o nome da conta do usuário selecionado, quando selecionada.
  • Eu queria poder usar o ponto de entrada do serviço Web a partir do site SharePoint atual em que estava. Isso foi um pouco mais difícil, ou pelo menos não óbvio, de se fazer a partir do Silverlight. Felizmente, consegui resolver isso com este código:

 

//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");

 

Na verdade, essa é provavelmente a única parte particularmente interessante. Estou anexando o código para o controle do usuário a esta postagem. Infelizmente, por vários motivos, não posso inclui todo o projeto, mas espero que esta postagem e o próprio código de controle sejam suficientes para ajudá-lo caso precise de algo assim.

Esta é uma postagem de blog traduzida. Encontre o artigo original em Writing A SharePoint 2010 People Picker Control for Silverlight