terça-feira, 2 de fevereiro de 2010

Usando Microsoft.SharePoint.dll para listar o ID das listas de um site

Ao migrar um site de uma web application para outra via o backup do SharePoint Designer (menu Site > Administration > Backup Web Site), várias web parts que eu tinha convertido para XSLT mostravam uma mensagem "estranha":
The server returned a non-specific error when trying to get data from the data source. Check the format and content of your query and try again. If the problem persists, contact the server administrator.
Quando você converte uma web part que mostra uma lista para XSLT, o SharePoint coloca na página um controle do tipo WebPartPages:DataFormWebPart para mostrar os dados da lista. Este controle designa a lista cujos dados devem ser mostrados através de seu ID (cada lista no SharePoint ganha um GUID como identificador, que é armazenado na propriedade ID da lista). Pois bem, quando migrei o site para seu novo local, as listas foram recriadas, e logicamente ganharam IDs diferentes. E aí as web parts que faziam referência a elas via ID pararam de funcionar.

Sendo um geek empolgado, resolvi testar o uso de Microsoft.SharePoint.dll para fazer um aplicativozinho de linha de comando que listasse os IDs das listas de um site. Ridiculamente fácil. O código está a seguir, e é um exemplo legal pra dar uma idéia do uso das classes no namespace Microsoft.SharePoint. Pra quem quiser só usar a ferramenta, é só baixar o seguinte arquivo e rodá-lo no seu servidor SharePoint: SPListId.zip.


Imports Microsoft.SharePoint

Module Module1

Sub Main()
Try
Console.WriteLine()
If My.Application.CommandLineArgs.Count = 0 Then
Console.WriteLine("SPListId - Lista os ID das listas de um site")
Console.WriteLine("Copyright (c) 2010 SrNimbus. No rights reserved ;)")
Console.WriteLine("Uso: SPListId url_do_site")
Return
End If
' A classe System.Uri auxilia na manipulação de endereços de rede
Dim urlSite As Uri = New Uri(My.Application.CommandLineArgs(0))
' A classe Microsoft.SharePoint.SPSite representa uma site collection do SharePoint
Dim siteCollection As New SPSite(urlSite.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped))
' A classe Microsoft.SharePoint.SPWeb representa um site dentro de uma site collection
Dim site As SPWeb = siteCollection.OpenWeb(urlSite.AbsolutePath)
Console.WriteLine("Listas em {0}:", urlSite.OriginalString)
Console.WriteLine("------------------------------------")
' A classe SPList representa uma lista do SharePoint
For Each lista As SPList In site.Lists
Console.WriteLine("{0}: {{{1}}}", lista.Title, lista.ID.ToString().ToUpper())
Next
Console.WriteLine("------------------------------------")
Catch erro As Exception
Console.WriteLine("Ooops:")
Console.WriteLine("{0} - {1}", erro.Source, erro.Message)
Finally
Console.WriteLine()
End Try
End Sub

End Module

Lembre-se de colocar uma referência a Microsoft.SharePoint.dll para poder compilar o projeto. Ela está na máquina do SharePoint, em %ProgramFiles%\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI.