Criar um novo Projecto com o Visual Studio 2010 no Template “Silverlight” e seleccionar a opção para associar a um novo Web site com a versão do Silverlight 4:
Para realizar as chamadas ao conteúdo do SharePoint, através da API em Silverlight, será necessário adicionar como referencias as DLL’s que se encontram na pasta da instalação do SharePoint 2010 (Microsoft.SharePoint.Client.Silverlight e Microsoft.SharePoint.Client.Silverlight.Runtime), tipicamente em C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\ClientBin.
A Microsoft disponibilizou um package com as DLLs em SharePoint .NET Client Object Model, onde se poderá realizar o download e a sua distribuição ao cliente.
SharePoint Foundation 2010 Client Object Model Redistributable
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b4579045-b183-4ed4-bf61-dc2f0deabe47
Com a utilização do Visual Studio 2010 existe a possibilidade de integrar o Microsoft Expression Blend 4 com as nossas aplicações desenvolvidas em Silverlight.
Depois de termos realizado a nossa customização podemos voltar à nossa solução em Visual Studio 2010 e começar a criar os nosso métodos para retornar conteúdo do Site. Para isso criei 2 métodos, um para retornar a listas do nosso site em SharePoint e outro para retornar o conteúdo de uma Lista numa Datagrid.
Método 1:
Retorna o nome das Listas existentes no site de SharePoint utilizando o Client Object Mode. Foi utilizado uma expressão Lambda para retornar as listas e o Titulo associado.
private
void
LoadLists()
{
ClientContext clientContext =
new
ClientContext(“http:
//[Site]“);
oWebsite = clientContext.Web;
collList = oWebsite.Lists;
clientContext.Load(oWebsite,
website => website.Title);
//Lambda expression para retornar as Listas
listInfo = clientContext.LoadQuery(
collList.Include(
list => list.Title,
list => list.Fields.Include(
field => field.Title).Where(
field => field.Required ==
true
&& field.Hidden !=
)));
clientContext.ExecuteQueryAsync(onQuerySucceeded, onQueryFailed);
}
private void onQuerySucceeded(object sender, ClientRequestSucceededEventArgs args){ UpdateUIMethod updateUI = DisplayInfo; this.Dispatcher.BeginInvoke(updateUI);} private void onQueryFailed(object sender, ClientRequestFailedEventArgs args){ MessageBox.Show("Request failed. " + args.Message + "\n" + args.StackTrace);} private void DisplayInfo(){ collList = oWebsite.Lists; listBox1.ItemsSource = listInfo; listBox1.DisplayMemberPath = "Title";}private delegate void UpdateUIMethod();
onQuerySucceeded(
object
sender, ClientRequestSucceededEventArgs args)
{ UpdateUIMethod updateUI = DisplayInfo;
this
.Dispatcher.BeginInvoke(updateUI);
onQueryFailed(
sender, ClientRequestFailedEventArgs args)
{ MessageBox.Show(
"Request failed. "
+ args.Message +
"\n"
+ args.StackTrace);
DisplayInfo()
{ collList = oWebsite.Lists; listBox1.ItemsSource = listInfo; listBox1.DisplayMemberPath =
"Title"
;
delegate
UpdateUIMethod();
Exemplo:
http://msdn.microsoft.com/en-us/library/ee538971.aspx
Método 2:
Retorna dados da Lista “Geral” para uma DataGrid utilizando CAML para realizar os filtros dos conteúdos a retornar:
private void LoadGrid(){ //Contexto do site em SharePoint a chamar var context = new ClientContext("http://[Site]"); context.Load(context.Web); //retornar o objecto List com o nome “Geral” List projects = context.Web.Lists.GetByTitle("Geral"); context.Load(projects); //CAML Query para Filtar os valores da nossa Lista CamlQuery camlQuery = new CamlQuery(); camlQuery.ViewXml = "<View><Query><Where><Geq><FieldRef Name='ID'/>" + "<Value Type='Number'>0</Value></Geq></Where></Query><RowLimit>100</RowLimit></View>"; _projectItems = projects.GetItems(camlQuery); context.Load(_projectItems); context.ExecuteQueryAsync(OnRequestSucceeded, null);}
LoadGrid()
//Contexto do site em SharePoint a chamar
var context =
ClientContext(
"http://[Site]"
);
context.Load(context.Web);
//retornar o objecto List com o nome “Geral”
List projects = context.Web.Lists.GetByTitle(
"Geral"
context.Load(projects);
//CAML Query para Filtar os valores da nossa Lista
CamlQuery camlQuery =
CamlQuery();
camlQuery.ViewXml =
"<View><Query><Where><Geq><FieldRef Name='ID'/>"
+
"<Value Type='Number'>0</Value></Geq></Where></Query><RowLimit>100</RowLimit></View>"
_projectItems = projects.GetItems(camlQuery);
context.Load(_projectItems);
context.ExecuteQueryAsync(OnRequestSucceeded,
null
#region Methods
OnRequestSucceeded(Object sender, ClientRequestSucceededEventArgs args)
Dispatcher.BeginInvoke(BindData);
BindData()
//Utilizando o conteúdo numa lista de Objecto do tipo Geral como a Lista
var list =
List<Geral>();
foreach
(var li
in
_projectItems)
list.Add(
Geral
Title = li[
].ToString(),
Nome = li[
"Nome"
Activo = Convert.ToBoolean(li[
"Activo"
].ToString())
});
//adicionar os Dados da Lista na Datagrid
dataGrid1.ItemsSource = list;
Método 3:
Este método ira criar uma nova entrada na Lista de SharePoint de um novo anúncio.
if (!TxtTitle.Text.Equals("")) { ClientContext clientContext = new ClientContext(TxtUrl.Text); Web oWebsite = clientContext.Web; ListCollection collList = oWebsite.Lists; oList = clientContext.Web.Lists.GetByTitle("Anuncios"); ListItem oListItem = oList.AddItem(new ListItemCreationInformation()); oListItem["Title"] = TxtTitle.Text; oListItem["Body"] = TxtBody.Text; oListItem.Update(); clientContext.Load(oList, list => list.Title); clientContext.ExecuteQueryAsync(onQueryInsertSucceeded, onQueryInsertFailed);} else { MessageBox.Show("Vazio!!"); }
if
(!TxtTitle.Text.Equals(
""
))
ClientContext(TxtUrl.Text);
Web oWebsite = clientContext.Web;
ListCollection collList = oWebsite.Lists;
oList = clientContext.Web.Lists.GetByTitle(
"Anuncios"
ListItem oListItem = oList.AddItem(
ListItemCreationInformation());
oListItem[
] = TxtTitle.Text;
"Body"
] = TxtBody.Text;
oListItem.Update();
clientContext.Load(oList,
list => list.Title);
clientContext.ExecuteQueryAsync(onQueryInsertSucceeded, onQueryInsertFailed);
else
"Vazio!!"
); }
Com a criação deste 2 pequenos exemplos podemos criar a nossa solução “AccessData.XAP”.
SharePoint disponibiliza ferramentas para integrar o projecto desenvolvido em Silverlight e adicionar nos nossos sites em SharePoint de uma forma bastante simples.
O primeiro passo será adicionar o nosso projecto em Silverlight, neste caso “AccessData.XAP” e adicionar no nosso site em SharePoint, podendo ser uma Folder, uma Document Library ou até na directoria ou pasta “Hive” onde se encontra instalado o SharePoint no servidor. Neste caso criei uma Folder dentro do site em SharePoint. Estas pastas não são visíveis aos utilizadores finais, garantido que o ficheiro não é apagado acidentalmente.
Depois de adicionado a nossa solução em Silverlight, acedemos ao nosso site em SharePoint e adicionamos uma Web Part que se encontra por defeito no SharePoint “Silverlight Web Part”. Um dos parâmetros que é requisitado é o caminho de onde se encontra a nossa solução em Silverlight.
Assim que esteja tudo correctamente adicionado, irá ser disponibilizado na nossa página de internet a nossa solução de Silverlight, dentro do SharePoint, numa WebPart podendo trabalhar e interagir com o conteúdo do Site onde se encontra.
Quando nos encontramos a trabalhar em ambiente Web a aplicação Fiddler é uma ferramenta essencial para captura e validação dos nosso trafico na Web. Estando ela em funcionamento podemos encontrar as transacções realizadas, através da Client OM, e encontra-mos uma chamada ao WCF Web Service “client.svc” e um Web Service XML para comunicação e transacção das operações.
Existem outra forma de poder interagir com os dados em SharePoint, com o Silverlight através dos “REST” em WCF e com todas as suas potencialidades.
Using the Silverlight Object Model http://msdn.microsoft.com/en-us/library/ee538971.aspx
Using the SharePoint Foundation 2010 Managed Client Object Model http://msdn.microsoft.com/en-us/library/ee857094.aspx
Using the SharePoint Foundation 2010 Managed Client Object Model with the Open XML SDK 2.0 http://msdn.microsoft.com/en-us/library/ee956524.aspx SharePoint 2010 SDK SharePoint 2010 Reference: Software Development Kit
Create a Silverlight 4 Web Part for SharePoint 2010 http://msdn.microsoft.com/en-us/magazine/ff956224.aspx Artigo realizado por: André Lage http://aaclage.blogspot.com
Craig Lussier edited Revision 1. Comment: added SharePoint 2010 tag
André Lage edited Original. Comment: Assinatura do Artigo
Muito bom o artigo
After using the Translate tool I read this post - it is fantastic and provides great insight. Thanks for the post!