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