SharePoint 4 Developers

Guia de referência adicional em desenvolvimento .NET / SharePoint

ILSpy - Ferramenta Open-Source

Uma nova ferramenta open-source está disponível para substituir o .NET Reflector.

Oi pessoal,

Uma nova ferramenta open-source está disponível para substituir o .NET Reflector, que não é mais Free.

ILSpy é um visualizador e decompilador de assemblies .NET:
http://wiki.sharpdevelop.net/ILSpy.ashx

Daqui pra frente, utilize esta ferramenta para investigar o IL (Intermediate language). Faz tudo que o .NET Reflector fazia.

[]'s,

Marcel Medina

Clique aqui para ler o mesmo conteúdo em Inglês.

Silverlight SharePoint Web Parts

Essa é uma nova extensão para o Visual Studio 2010 que disponibiliza templates para a criação de Silverlight Web Parts no SharePoint 2010, chamada Silverlight SharePoint Web Parts.

Oi pessoal, tudo bem?

Uma nova extensão para o Visual Studio 2010 foi lançada por Paul Stubbs recentemente que disponibiliza templates para a criação de Silverlight Web Parts no SharePoint 2010, chamada Silverlight SharePoint Web Parts.

A tarefa de criar Silverlight Web Parts manualmente é um pouco trabalhoso, pois exige uma certa adaptação do projeto no Visual Studio, conforme você pode conferir: http://msdn.microsoft.com/en-us/library/ff798492.aspx

O bacana dessa nova extensão é que ela se utiliza do SharePoint 2010 Power Tools para a criação de Visual Web Parts no Sandbox.

Instalação

1) Instale a extensão Visual Studio 2010 SharePoint Power Tools.

1a1b1c
Figuras 1,2,3 – Telas de instalação da extensão Visual Studio 2010 SharePoint Power Tools

2) Instale a extensão Silverlight SharePoint Web Parts.

2a2b
Figuras 4,5 – Telas de instalação da extensão Silverlight SharePoint Web Parts

3) Abra o Visual Studio e verifique se a extensão está disponível. Vá a Tools > Extension Manager:

3
Figura 6 – Extension Manager do Visual Studio 2010

Novos Templates

Apenas para demonstração dos templates, vamos criar um exemplo de cada e compararmos. Algo bem simples como o Hello World. Siga os passos abaixo:

1) Crie 2 novos projetos Silverlight Application. Nomeie de HelloWorld1 e HelloWorld2:

4a
Figura 7 – Criação de Silverlight Application

4b
Figura 8 – Silverlight 4

OBS: Faça o mesmo para o Hello World 2.

A solução ficará assim:

5
Figura 9 – Projetos Hello World

 

2) Adicione um pequeno trecho de XAML nas páginas MainPage.xaml de ambos os projetos:

Code Snippet
  1. <TextBlock Text="Hello World 1!" />

 

O XAML final deve ficar parecido com este:

Code Snippet
  1. <UserControl x:Class="HelloWorld1.MainPage"
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5.     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6.     mc:Ignorable="d">
  7.  
  8.     <TextBlock Text="Hello World 1!" />
  9. </UserControl>

 

3) Adicione 2 novos projetos do tipo Empty SharePoint Project à solução. O primeiro chamado SilverlightWebPart (Figura 10) e o segundo chamado SilverlightCustomWebPart:

6a
Figura 10 – Empty SharePoint Project

Agora a solução se parece com isso:

7
Figura 11 – Projetos adicionados

4) Para cada um dos novos projetos adicionados, adicionaremos Web Parts. Para o projeto SilverlightWebPart, adicione a Silverlight Web Part. Nomeie de SilverlightWP (Figura 13).

Para o projeto SilverlightCustomWebPart selecione a Silverlight Custom Web Part que é uma Visual Web Part executada no sandbox. Nomeie de SilverlightCustomWP.

8
Figura 12 – Novos templates

 8a
Figura 13 – Adição de Web Part

Pelo fato de possuirmos mais de um projeto Silverlight, a extensão exibe uma tela para seleção do projeto conforme Figura 14:

8b
Figura 14 – Seleção do projeto Silverlight

OBS: Selecione HelloWorld1 para o projeto SilverlightWebPart e HelloWorld2 para SilverlightCustomWebPart.

Caso tivéssemos apenas um projeto Silverlight na solução, a popup não seria exibida e uma referência automática ao projeto Silverlight existente seria feita.

Solução Final

O resultado final nos 2 projetos de Silverlight é a criação automática de módulos do SharePoint para deploy do xap na Master Page Gallery, Web Part na Web Part Gallery e página para exibição da Web Part na Library SitePages.

A diferença no projeto SilverlightCustomWebPart é a criação de um UserControl para host do xap. Esse caso é interessante pois podemos utilizar javascript para integração com o Silverlight.

Veja a solução final:

9
Figura 15 – Solução Final

Aqui os resultados:

10a
10b
Figuras 16 e 17 – Silverlight Web Parts

Referências:

http://visualstudiogallery.msdn.microsoft.com/e8360a85-58ca-42d1-8de0-e48a1ab071c7
http://visualstudiogallery.msdn.microsoft.com/8e602a8c-6714-4549-9e95-f3700344b0d9
http://channel9.msdn.com/Shows/SilverlightTV

[]’s

Marcel Medina

Clique aqui para ler o mesmo conteúdo em Inglês.

Criando Document Sets Programaticamente

Nesse post mostrarei como criar document sets programaticamente, explorando o assembly Microsoft.Office.DocumentManagement.dll, dispon&#237;vel no diret&#243;rio \14\ISAPI.

Oi pessoal,

Recentemente estive trabalhando com a criação de vários document sets em substituição à criação de pastas. É muito fácil criar document sets manualmente, mas quando você precisa criar vários deles, a melhor solução é fazê-los programaticamente.

Document sets são mais do que simples pastas. Eles contêm metadados, que estão mudando a maneira que os usuários estão trabalhando, os quais estão usufruindo das novas features.

Como uma nota rápida, nesse post mostrarei como criar document sets programaticamente, explorando o assembly Microsoft.Office.DocumentManagement.dll, disponível no diretório \14\ISAPI\.

A Solução

Basicamente esta solução mostra como criar um document set e adicioná-lo à uma Document Library.

OBS: 2 content types foram criados manualmente para o propósito dessa demo: Word Template e Excel Spreadsheet Template.

Veja o código abaixo:

Code Snippet
  1. static void Main(string[] args)
  2. {
  3.     var url = ConfigurationManager.AppSettings["Url"].ToString();
  4.     var sub = ConfigurationManager.AppSettings["Sub"].ToString();
  5.     var library = ConfigurationManager.AppSettings["Library"].ToString();
  6.  
  7.     using (SPSite site = new SPSite(url))
  8.     {
  9.         using (SPWeb web = (sub == "*") ? site.RootWeb : site.OpenWeb(sub))
  10.         {
  11.             string docsetName = "Document Set Test";
  12.             SPContentType ctype = null;
  13.  
  14.             if (web.ContentTypes[docsetName] == null)
  15.             {
  16.                 // Creating the document set (content type)
  17.                 ctype = new SPContentType(web.ContentTypes["Document Set"], web.ContentTypes, "Document Set Test");
  18.                 ctype.FieldLinks.Add(new SPFieldLink(web.Fields["Author"]));
  19.                 ctype.Group = "Test Content Types";
  20.                 web.ContentTypes.Add(ctype);
  21.  
  22.                 // Getting the document set (content type)
  23.                 DocumentSetTemplate docsetTemplate = DocumentSetTemplate.GetDocumentSetTemplate(ctype);
  24.  
  25.                 // Setting the content types
  26.                 docsetTemplate.AllowedContentTypes.Remove(web.ContentTypes["Document"].Id);
  27.                 docsetTemplate.AllowedContentTypes.Add(web.ContentTypes["Word Template"].Id);
  28.                 docsetTemplate.AllowedContentTypes.Add(web.ContentTypes["Excel Spreadsheet Template"].Id);
  29.  
  30.                 // Sharing fields
  31.                 docsetTemplate.SharedFields.Add(web.Fields["Author"]);
  32.  
  33.                 // Displaying fields
  34.                 docsetTemplate.WelcomePageFields.Add(web.Fields["Author"]);
  35.  
  36.                 // Adding default document
  37.                 FileStream wordFile = File.OpenRead(Path.GetFullPath(@"DocumentSet\Default.dotx"));
  38.                 byte[] binWordFile = new byte[wordFile.Length];
  39.                 wordFile.Read(binWordFile, 0, binWordFile.Length);
  40.  
  41.                 docsetTemplate.DefaultDocuments.Add("Default.dotx", web.ContentTypes["Word Template"].Id, binWordFile);
  42.  
  43.                 // Updating the document set (content type),   
  44.                 docsetTemplate.Update(true);
  45.                 ctype.Update();
  46.             }
  47.  
  48.             ctype = ctype ?? web.ContentTypes[docsetName];
  49.  
  50.             if (web.Lists.TryGetList(library) == null)
  51.             {
  52.                 // Creating document library
  53.                 Guid libraryGuid = web.Lists.Add(library, "", SPListTemplateType.DocumentLibrary);
  54.                 SPDocumentLibrary list = (SPDocumentLibrary)web.Lists[libraryGuid];
  55.  
  56.                 // Setting properties
  57.                 list.OnQuickLaunch = true;
  58.                 list.ContentTypesEnabled = true;
  59.                 list.EnableFolderCreation = false;
  60.  
  61.                 // Defining content types
  62.                 list.ContentTypes.Delete(list.ContentTypes["Document"].Id);
  63.                 list.ContentTypes.Add(ctype);
  64.                 list.Update();
  65.  
  66.                 System.Collections.Hashtable properties = new System.Collections.Hashtable();
  67.                 properties.Add("DocumentSetDescription", "Just an example"); //InternalName
  68.                 properties.Add("_Author", "MM"); //InternalName
  69.  
  70.                 // Creating the document set
  71.                 DocumentSet.Create(list.RootFolder, "DocSet1", list.ContentTypes.BestMatch(ctype.Id), properties, true);
  72.             }
  73.         }
  74.     }
  75. }

OBS: Uma Document Library é criada dinamicamente para o propósito dessa demo.

Faça o download da solução aqui.

Espero que isso ajude. Smile

Referências:
http://technet.microsoft.com/en-us/library/ff603637.aspx
http://office.microsoft.com/en-us/sharepoint-server-help/CH010372625.aspx
http://msdn.microsoft.com/en-us/library/ee574540.aspx

[]’s,

Marcel Medina

Clique aqui para ler o mesmo conteúdo em Inglês.