SharePoint 2010: Anatomía de un proyecto de WebPart en VS 2010!

Sin duda, a la hora de crear artefactos para SharePoint 2010 como WebParts, manejadores de eventos, etc la ayuda que nos brindan las Visual Studio 2010 Tools para SharePoint es fundamental. Ahora bien, aunque el uso de las herramientas nos ahorre mucho trabajo y simplifique las tareas a realizar es importante tener una idea clara de lo que estamos haciendo y saber que elementos forman parte de uno de estos artefactos. Cuando añadimos un elemento de tipo WebPart por ejemplo en un proyecto de Visual Studio para SharePoint, automáticamente se crea un SPI o SharePoint Project Item que contiene los elementos mínimos para poder desplegar una WebPart en nuestros sitios de SharePoint y que esté plenamente operativa:

image

  • Archivo de manifiesto, clave en este caso para provisionar el archivo .webpart que contiene toda la definición de una WebPart como el título, la descripción, etc. En este archivo son destacables:
    • La declaración del tipo .NET que se corresponde con la WebPart (definido en <metaData>) que en este caso está definido como un nombre completo (Full name) a través de la propiedad name que en este caso tiene el valor SPLINQWP.SPLINQToSPCRWP.SPLINQToSPCRP junto con el nombre del ensamblado que se especifica mediante $SharePoint.Project.AssemblyFullName$ que es automáticamente reemplazado por VS 2010 por el nombre del ensamblado durante el proceso de despliegue.
   1: <?xml version="1.0" encoding="utf-8"?>

   2: <webParts>

   3:   <webPart xmlns="http://schemas.microsoft.com/WebPart/v3">

   4:     <metaData>

   5:       <type name="SPLINQWP.SPLINQToSPCRWP.SPLINQToSPCRWP, $SharePoint.Project.AssemblyFullName$" />

   6:       <importErrorMessage>$Resources:core,ImportErrorMessage;</importErrorMessage>

   7:     </metaData>

   8:     <data>

   9:       <properties>

  10:           <property name="ChromeType" type="chrometype">TitleAndBorder</property>

  11:           <property name="Title" type="string">LINQ To SharePoint WP</property>

  12:           <property name="TitleIconImageUrl" type="string">_layouts/images/SPLINQWP/Feature_Icon_2.jpg</property>

  13:           <property name="Description" type="string">LINQ To SharePoint WebPart</property>

  14:           <property name="CatalogIconImageUrl" type="string">_layouts/images/SPLINQWP/Feature_Icon_2.jpg</property>

  15:           <property name="AllowEdit" type="bool">True</property>

  16:           <property name="AllowClose" type="bool">False</property>

  17:           <property name="AllowHide" type="bool">False</property>

  18:           <property name="AllowMinimize" type="bool">False</property>

  19:           <property name="AllowZoneChange" type="bool">False</property>

  20:           <property name="AllowConnect" type="bool">False</property>

  21:           <property name="ExportMode" type="exportmode">All</property>

  22:       </properties>

  23:     </data>

  24:   </webPart>

  25: </webParts>

  • Archivo de manifiesto “Elements.xml” en el que definimos como vamos a provisionar la WebPart. Más en concreto, como vamos a provisionar el archivo .webpart anterior en la galería de webparts y también en qué categoría se va a ubicar:
   1: <?xml version="1.0" encoding="utf-8"?>

   2: <Elements xmlns="http://schemas.microsoft.com/sharepoint/" >

   3:   <Module Name="SPLINQToSPCRWP" List="113" Url="_catalogs/wp">

   4:     <File Path="SPLINQToSPCRWPSPLINQToSPCRWP.webpart" Url="SPLINQToSPCRWP.webpart" Type="GhostableInLibrary" >

   5:       <Property Name="Group" Value="BootCamp Costa Rica" />

   6:     </File>

   7:   </Module>

   8: </Elements>

  • Una clase que representa a la WebPart y que hereda de la clase base WebPart que como tal modela un control personalizado de ASP.NET. La definición de esta clase, para una WebPart de tipo clásico o una WebPart de tipo visual es como sigue:
   1: using System;

   2: using System.ComponentModel;

   3: using System.Web;

   4: using System.Web.UI;

   5: using System.Web.UI.WebControls;

   6: using System.Web.UI.WebControls.WebParts;

   7: using Microsoft.SharePoint;

   8: using Microsoft.SharePoint.WebControls;

   9:  

  10: namespace SPLINQWP.SPLINQToSPCRWP

  11: {

  12:     [ToolboxItemAttribute(false)]

  13:     public class SPLINQToSPCRWP : WebPart

  14:     {

  15:         // Visual Studio might automatically update this path when you change the Visual Web Part project item.

  16:         private const string _ascxPath = @"~/_CONTROLTEMPLATES/SPLINQWP/SPLINQToSPCRWP/SPLINQToSPCRWPUserControl.ascx";

  17:  

  18:         protected override void CreateChildControls()

  19:         {

  20:             Control control = Page.LoadControl(_ascxPath);

  21:             Controls.Add(control);

  22:         }

  23:     }

  24: }

  • Como vemos, uno de los puntos clave de la clase es la sobreescritura del método CreateChildControls() que como en cualquier control ASP.NET nos permite definir los controles web que constituyen la WebPart. En este caso, al tratarse de una WebPart visual tendremos un control definido a partir del user control que constituye la parte visual de la WebPart.
  • Un archivo de tipo user control para el caso de WebParts visuales.

Hasta aquí los elementos clave que forman parte de la WebPart a desplegar…pero, ¿cómo se despliega y hace disponible esta WebPart? Pues a través del correspondiente .WSP y de la correspondiente feature:

  • Si examinamos de nuevo la solución creada en Visual Studio 2010 veremos que tenemos un nodo Package en el que se define la plantilla del .WSP a generar. Es en esta definición dónde se indica que la WebPart se empaqueta como un .WSP indicando aspectos como:
    • La ubicación de despliegue de la WebPart (en este caso la GAC o Global Assembly Cache)
    • El “nombre fuerte” o strong name del ensamblado: nombre, versión, cultura y PublicKeyToken. Este strong name es el que permite añadir el ensamblado como un control seguro,
  • Y todo esto lo hace Visual Studio 2010 automáticamente por nosotros:
   1: <Solution xmlns="http://schemas.microsoft.com/sharepoint/" SolutionId="7ea4b87f-de64-46ec-9208-ac5b11d184b3" SharePointProductVersion="14.0">

   2:   <Assemblies>

   3:     <Assembly Location="SPLINQWP.dll" DeploymentTarget="GlobalAssemblyCache">

   4:       <SafeControls>

   5:         <SafeControl Assembly="SPLINQWP, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2ebe5d86e0efc3de" Namespace="SPLINQWP.SPLINQToSPCRWP" TypeName="*" />

   6:       </SafeControls>

   7:     </Assembly>

   8:   </Assemblies>

   9:   <TemplateFiles>

  10:     <TemplateFile Location="CONTROLTEMPLATESSPLINQWPSPLINQToSPCRWPSPLINQToSPCRWPUserControl.ascx" />

  11:     <TemplateFile Location="ImagesSPLINQWPFeature_Icon_2.jpg" />

  12:   </TemplateFiles>

  13:   <FeatureManifests>

  14:     <FeatureManifest Location="SPLINQWP_SPLINQToSharePointWPFeatureFeature.xml" />

  15:   </FeatureManifests>

  16: </Solution>

  • La correspondiente Feature o Característica cuya activación hace posible que dispongamos de la WebPart para poder usar en nuestros sitios. Esta característica define la ubicación del archivo de manifiesto de la WebPart y del archivo .webpart.
   1: <Feature xmlns="http://schemas.microsoft.com/sharepoint/" Title="SP LINQ To SharePoint WebPart" Description="SP LINQ To SharePoint WebPart" Id="1e918292-9c18-4d06-9ede-b079d6e017ae" ImageUrl="SPLINQWP/Feature_Icon_2.jpg" Scope="Site">

   2:   <ElementManifests>

   3:     <ElementManifest Location="SPLINQToSPCRWPElements.xml" />

   4:     <ElementFile Location="SPLINQToSPCRWPSPLINQToSPCRWP.webpart" />

   5:   </ElementManifests>

   6: </Feature>

image image

Publicado por

Juan Carlos González

Juan Carlos es Ingeniero de Telecomunicaciones por la Universidad de Valladolid y Diplomado en Ciencias Empresariales por la Universidad Oberta de Catalunya (UOC). Cuenta con más de 12 años de experiencia en tecnologías y plataformas de Microsoft diversas (SQL Server, Visual Studio, .NET Framework, etc.), aunque su trabajo diario gira en torno a SharePoint & Office 365. Juan Carlos es MVP de Office Servers & Services desde 2015 (anteriormente fue reconocido por Microsoft como MVP de Office 365 y MVP de SharePoint Server desde 2008 hasta 2015), coordinador del grupo de usuarios .NET de Cantabria (Nuberos.Net, www.nuberos.es), co-fundador y coordinador del Grupo de Usuarios de SharePoint de España (SUGES, www.suges.es), así como co-director de la revista gratuita en castellano sobre SharePoint CompartiMOSS (www.compartimoss.com). Hasta la fecha, ha publicado 8 libros sobre SharePoint & Office 365 y varios artículos en castellano y en inglés sobre ambas plataformas.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *