SharePoint 2010: Uso de las Visual Studio SharePoint Power Tools (I)!

Desde el pasado mes de junio tenemos disponibles las Visual Studio SharePoint Power Tools que entre otras mejoras habilitan la creación de una WebPart de tipo visual para ser desplegada en modo solución Sandbox o de recinto aislado, algo que hasta la liberación de estas herramientas no era posible. La idea de este post es ver como las Power Tools nos permiten crear una WebPart visual y desplegarla en un sitio de SharePoint. De todos modos, aviso a navegantes: que nadie espere que podrá crear una WebPart visual en modo Sandbox que permita hacer lo mismo que en el caso de tratarse de una WebPart visual desplegada en modo granja. Por ejemplo, añadir controles dentro de otro control o el update panel de ASP.NET AJAX no le gusta a este tipo de soluciones y alguna que otra sorpresa adicional. Os recomiendo que os leáis las limitaciones que aparecen en la página de Visual Studio Code Gallery desde la que se pueden bajar las Tools. Comencemos:

  • Después de descargarnos e instalar las Visual Studio SharePoint Power Tools, lo primero que haremos es crear un proyecto de SharePoint 2010 de tipo vacío en Visual Studio 2010.
  • En el asistente para la ceración del proyecto, especificamos que el tipo de solución a desplegar es Sandbox.
  • A continuación añadimos al proyecto un elemento de tipo Visual Web Part (Sandboxed) que se ha agregado al conjunto de elementos disponibles tras instalar las Power Tools.
image image image
  • A continuación se muestra el diseñador de WebParts visuales para SharePoint 2010 que nos permite ir arrastrando controles a la superficie de diseño para darle la apariencia deseada.
  • En mi caso, he añadido un control de tipo ListBox que contendrá los sitios definidos bajo la colección de sitios actual y por cada sitio seleccionado se muestran varias propiedades en los correspondientes controles de tipo Label.

image

  • El código de markup de la WebPart que he  añadido es el siguiente:
   1: <table style="width: 100%; border-style: solid; border-color: #CCCCCC; border-width: 1px;">

   2:    <tr>

   3:      <td style="width: 180px; vertical-align: top;">

   4: p:ListBox ID="lbSitios" runat="server" Height="132px" Width="154px" 

   5:  onselectedindexchanged="lbSitios_SelectedIndexChanged"></asp:ListBox>

   6:  />

   7:      </td>

   8:      <td style="width: auto; vertical-align: top;">

   9:        <table style="width: 100%;">

  10:          <tr>

  11:            <td style="width: 132px;">

  12:              Site Name

  13:            </td>

  14:            <td style="width: auto;">

  15:              <asp:Label ID="lblSiteName" runat="server"></asp:Label>

  16:            </td>

  17:          </tr>

  18:          <tr>

  19:            <td>

  20:              Site Url:

  21:            </td>

  22:            <td>

  23:              <asp:HyperLink ID="lnkSiteUrl" runat="server" Target="_blank" />

  24:            </td>

  25:          </tr>

  26:        </table>

  27:      </td>

  28:    </tr>

  29:  </table>

  30:  

  31:  

  32: p:Label ID="lblError" runat="server" Text="Label"></asp:Label>

  • Nos vamos a la vista de código de nuestra WebPart visual y la codificamos de la siguiente forma:
   1: using System;

   2: using System.ComponentModel;

   3: using System.Web.UI;

   4: using System.Web.UI.WebControls;

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

   6: using Microsoft.SharePoint;

   7: using Microsoft.SharePoint.WebControls;

   8:  

   9: //Espacios de nombres necesarios

  10: using System.Data;

  11: using Microsoft.SharePoint.Utilities;

  12: using System.Web;

  13:  

  14: namespace SPListSites.SPListSitesWP

  15: {

  16:     [ToolboxItem(false)]

  17:     public partial class SPListSitesWP : System.Web.UI.WebControls.WebParts.WebPart

  18:     {

  19:  

  20:         protected override void OnInit(EventArgs e)

  21:         {

  22:             base.OnInit(e);

  23:             InitializeControl();

  24:         }

  25:  

  26:         protected void Page_Load(object sender, EventArgs e)

  27:         {

  28:             if (! Page.IsPostBack)

  29:             {

  30:                 lbSitios.AutoPostBack = true;

  31:                 spListSites();               

  32:             }

  33:         }

  34:  

  35:         void spListSites()

  36:         {

  37:             try

  38:             {

  39:                 using (SPSite spsSiteColection = new SPSite(SPContext.Current.Web.Url))

  40:                 {

  41:                     DataTable dtSitios = 

  42:                         new DataTable();

  43:                     dtSitios.Columns.Add("Relative Url");

  44:                     dtSitios.Columns.Add("Absolute Url");

  45:  

  46:                     SPWebCollection spwWebColeccion = spsSiteColection.AllWebs;

  47:                     foreach (SPWeb spWeb in spwWebColeccion)

  48:                     {

  49:                         DataRow drRow = dtSitios.NewRow();

  50:                         drRow["Relative Url"] = spWeb.ServerRelativeUrl.ToString();

  51:                         drRow["Absolute Url"] = spWeb.Url.ToString();

  52:                         dtSitios.Rows.Add(drRow);

  53:                         lbSitios.DataTextField = "Relative Url";

  54:                         lbSitios.DataValueField = "Absolute Url";

  55:                         lbSitios.DataSource = dtSitios;

  56:                         lbSitios.DataBind();

  57:                         spWeb.Dispose();

  58:                     }

  59:                 }

  60:             }

  61:             catch (Exception ex)

  62:             {

  63:                 this.lblError.Text = "Error: " +

  64:                     ex.Message;

  65:             }

  66:         }

  67:  

  68:         protected void lbSitios_SelectedIndexChanged(object sender, EventArgs e)

  69:         {

  70:             this.lblSiteName.Text = lbSitios.SelectedItem.Text;

  71:             this.lnkSiteUrl.Text = lbSitios.SelectedItem.Value;

  72:             this.lnkSiteUrl.NavigateUrl = lbSitios.SelectedItem.Value;

  73:         }

  74:     }

  75: }

  • Como veis:
    • La lógica de la WebPart simplemente tiene un método spListSites que se encarga de obtener los sitios creados en la colección de sitios actual.
    • Para cada sitio encontrado, se almacenan algunas de sus propiedades en el correspondiente objeto DataTable que se usa como fuente de datos para el control ListBox.
    • Finalmente, el manejador lblSitios_SelectedIndexChanged() se encarga de detectar que se ha seleccionado uno de los sitios para mostrar la información asociada.
  • Una vez compilada la WebPart, la desplegamos a través de las opciones disponibles en Visual Studio y comprobamos que la solución aparece en la galería de soluciones del sitio.
  • Creamos una página de WebParts y probamos que nuestra WebPart funciona como se espera.
image image

Y hasta aquí llega este primer post sobre las Visual Studio SharePoint Power Tools.

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.

3 comentarios en “SharePoint 2010: Uso de las Visual Studio SharePoint Power Tools (I)!”

Deja un comentario

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