Creazione di un controllo selezione utenti di SharePoint 2010 per Silverlight

Articolo originale pubblicato mercoledì 10 agosto 2011

Una delle caratteristiche di cui gli sviluppatori di SharePoint sentono maggiormente la mancanza nella casella degli strumenti di Silverlight è un controllo selezione utenti. In SharePoint è disponibile un controllo che potete utilizzare in una web part o in una pagina con layout personalizzati, ovvero la classe PeopleEditor. Il codice Silverlight viene tuttavia eseguito interamente sul lato client, pertanto non esiste una soluzione predefinita per questa situazione. In un progetto che ho gestito di recente avevo assolutamente bisogno di questa funzionalità e ho scoperto un modo abbastanza semplice per creare una soluzione analoga. Di seguito potete trovare una schermata del mio controllo di selezione utenti No-UI-Talent, implementato come popup in Silverlight:

 

 

Per fare in modo che questa soluzione funzioni, è necessario utilizzare un servizio Web incluso in SharePoint, denominato servizio Web People. In questo caso ho utilizzato il metodo SearchPrincipals per trovare un elenco di possibili corrispondenza al testo immesso nella casella di ricerca. In questo semplice caso devo trovare un unico utente, tuttavia avrei anche potuto cercare gruppi, liste di distribuzione o gruppi di sicurezza di SharePoint. Potete anche implementare una versione personalizzata del controllo di immissione consentendo l'immissione di un nome e successivamente chiamando il metodo ResolvePrincipals su tale servizio Web. Di seguito potete trovare alcuni dettagli di implementazione che potrebbero interessarvi:

 

  • Il metodo restituisce un ObservableCollection di oggetti PrincipalInfo. Per semplificare la situazione, ho creato una classe personalizzata denominata PickerEntry che contiene una proprietà DisplayName e una proprietà AccountName. La classe PrincipalInfo include anche proprietà per Department e Email, che potrebbero esservi utili. In questo caso specifico ho ignorato il metodo ToString() nella classe e ho fatto in modo che venisse restituita la proprietà DisplayName. In questo modo ho ottenuto i nomi da mostrare nella casella di riepilogo ed ho determinato quale sia il nome account dell'utente selezionato.
  • Volevo riuscire a utilizzare il punto di ingresso del servizio Web dal sito di SharePoint in cui mi trovato. Ottenere questo risultato da Silverlight è stato un po' più complicato, o almeno non ovvio. Fortunatamente ci sono riuscito utilizzando il codice seguente:

 

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

 

In realtà questa è l'unica parte realmente interessante. In allegato a questo post di blog potete trovare il codice per il controllo utente. Per una serie di motivi non posso includere l'intero progetto, ma spero che questo post e il codice del controllo vi siano di aiuto qualora vi trovaste in una situazione simile a quella qui descritta.

Questo è un post di blog localizzato. L'articolo originale è disponibile in Writing A SharePoint 2010 People Picker Control for Silverlight