Usando los controles de SharePoint en WebParts

Sin duda, con el poder viene la responsabilidad. En pasados días publiqué un post acerca de cómo utilizar los controles de ASP.NET y toda su experiencia gloria dentro de WebParts de SharePoint. Sin embargo, al utilizar esta estrategia un conjunto de consideraciones subsecuentes deberán ser contempladas como hacer uso de los mismos controles SharePoint dentro de estos WebParts.

En ese sentido, debido a que sin problema alguno puedo utilizar el GridView y/o cualquier control ASP.NET al principio suena atractiva la posibilidad pero como siempre la realidad se asoma y nos muestra al que un día fue novedoso control Calendar de ASP.NET y con todo el debido respeto, hoy no es la mejor opción para la captura de una fecha dentro de una forma en SharePoint, al menos la mejor opción es usar el mismo control que se usa en SharePoint, ¿estás de acuerdo?

Vamos a nuestro Web User Control y registramos los controles web de SharePoint. Estos son los controles mejorados que SharePoint internamente utiliza en su capa de presentación.

image

Después dentro de nuestro código Markup agregamos el control SharePoint que requerimos:

image

Lo interesante es que tenemos una gama de controles de SharePoint disponibles.

image

A continuación dentro del código hacemos referencia al control de SharePoint para poder adjuntar algún evento o leer su valor.

image

Y el resultado es:

image

Estos controles cuentan con validaciones, propiedades y eventos que podemos utilizar a nuestro favor. Créditos a Luis Edmundo Teos por el reto y escenario.

Suerte!

Originalmente publicado en msmvps.com

Configurando REST en SharePoint 2010

Como todo un programador .NET con deseo de hacer carrera en SharePoint, inquieto y con todo un futuro por delante, seguramente en algún momento te has enterado de que SharePoint 2010 cuenta con una interface REST para exoponer y consumir los datos. Accedes al portal SharePoint 2010 de tu empresa para hacer una prueba y verificar que realmente puedas consumir la información mediante REST y después de teclear /_vti_bin/listdata.svc/Anuncios la dirección Url del sitio en cuestión sucede el siguiente error:

clip_image001

Investigas un poco y encuentras que este error se refiere a que no tenemos instalado los ensamblados de ADO.NET Data Services Update for .NET Framework 3.5 SP1 codename Astoria. Decides buscar un poco más al respecto y encuentras la conferencia que presentó Pablo Castro en el Professional Developer Conference en el 2009 en los Angeles, CA. Sin duda te dices a ti mismo “Mi mismo, un año iré al PDC”. Escuchas la conferencia y quedas aún más emocionado por desarrollar sobre SharePoint usando interfaces REST y todo el poder a tu disposición para crear aplicaciones de servidor y cliente, al ser una interface REST que hace uso de las operaciones o verbos del protocolo HTTP sabes que es consumible vía JavaScript o Silverlight.

Te das a la tarea de buscar el Fix y encuentras la dirección Url de ADO.NET Data Services Update for .NET Framework 3.5 SP1 for Windows 7 and Windows Server 2008 R2 para descargarlo. Con la autorización de tus superiores solicitas que se implemente el fix sobre los servidores de la granja y una vez que esto es aprovisionado haces la prueba obteniendo la información esperada desde la dirección Url.

clip_image003

Ahora como todo un programador puedes consumir la informacion expuesta desde un proyecto Silverlight 🙂 el cual explicare en otro post.

Originalmente publicado en msmvps.com

Respaldo y restauración granular de un sitio de equipo en SharePoint 2010

A continuación los pasos para realizar un procedimiento de respaldo y restauración granular de un sitio SharePoint 2010.

Accedemos a la herramienta central de administración SharePoint y seleccionamos Backup and Restore y después la opción de Export a site or list. Esta opción nos permite hacer un respaldo de sitios y/o elementos como listas o bibliotecas de forma granular, esta opción básicamente hace uso de Content Deployment para empaquetar en un archivo .cmp un sitio o lista el cual posteriormente podremos restaurar.

clip_image002

Ya dentro de Export a Site or List elegimos la colección de sitios de donde se encuentra el sitio que requerimos, buscamos de la lista el sitio en particular que necesitamos respaldar. Como se puede observar podemos llegar a un nivel mayor “lista” de respaldo granular. Es muy importante especificar la ruta en donde se depositaran los archivos de nuestra exportación, en este caso el servidor es splapp y la carpeta backup, es importante asegurarse que la carpeta esta compartida y con los permisos necesarios para que la cuenta del sistema SharePoint pueda crear archivos dentro de dicha carpeta.

clip_image004

En caso de requerir exportar los permisos específicos que se tienen entonces elegimos Export Full Security y así mismo elegimos el esquema de versiones que deseamos exportar, el exportador se puede llevar todas las versiones de un documento. Estas opciones son las mismas que especificamos programáticamente cuando utilizamos el modelo de objetos SharePoint para hacer Content Deployment. Damos clic en el botón Star Export.

Esto inicia el proceso de exportación, dependiendo del contenido del sitio o lista que deseas exportar es el tiempo que durara el proceso, este proceso si es un poco lento.

clip_image006

Sin embargo, la misma página constantemente se está refrescando para poder visualizar el estatus del proceso que se está ejecutando.

clip_image008

Una vez que termina el proceso de exportación, tendremos en nuestra carpeta un par de archivos.

clip_image010

El archivo demo.cmp básicamente es el resultado de nuestro proceso de exportación y contiene el contenido e instrucciones necesarias para poder ser importado más adelante. Así mismo, se agrega un archivo en formato texto con la bitácora de exportación. Esta bitácora muestra los elementos que fueron incluidos en la exportación, desde permisos, carpetas, paginas maestras, características. Te recomiendo analizar el archivo pero si tienes prisa lo más importante es validar que no se tengan errores al final del archivo.

clip_image012

Y para montar nuestro respaldo granular debemos de asegurarnos que el sitio o lista que deseamos restaurar sea del mismo tipo de plantilla de sitio de donde se respaldó, en caso de que difiera la plantilla el proceso de restauración generara un error.

Para restaurar el respaldo simplemente cargamos Microsoft SharePoint 2010 Management Shell de PowerShell. Después ejecutamos el siguiente script donde especificamos claramente la ruta del sitio donde estaremos restaurando y la ruta del archivo de respaldo.

clip_image014

El restado del proceso es un archivo de bitácora de importación que nos ofrece información de los elementos aprovionados. De la misma manera hay que validar al final del archivo que no se tenga errores.

clip_image015

Originalmente publicado en msmvps.com

Programación ASP.NET en WebParts de SharePoint

Si eres un de desarrollador ASP.NET que se está iniciando en desarrollo SharePoint este ejemplo puede ser de utilidad. Básicamente, usaremos un enfoque de desarrollo de WebParts basado en el uso de Web User Controls de ASP.NET 2.0.

Antes que nada utilizaremos las siguientes herramientas:

Dentro de nuestro servidor de desarrollo SharePoint cargamos Visual Studio 2008 y elegimos la creación de un proyecto SharePoint en blanco, este proyecto lo nombraremos ASPNETWebPart.

clip_image002

Especificaremos que el nivel de confianza de esta solución SharePoint sea Full Trust y la razón es que usaremos un método Page.LoadControl que requiere de permisos elevados para ejecutarse, me parece que la razón es porque este método lee de la ruta de archivos SharePoint “12 hive” y para ello requiere que el proceso w3wpg.exe solicite los permisos necesarios.

clip_image004

Usando la solución generada por Visual Studio 2008 dentro del Solution Explorer agregamos un nuevo Empty Web Site de ASP.NET llamado ASPNETWebPArtsWebSite ubicándolo en la misma carpeta creada por nuestro proyecto anterior.

clip_image006

Dentro de nuestro proyecto ASPNETWebPartWebSite agregamos un Web User Control llamado ASPNETWebUserControl y es muy importante que no deseleccionemos el cuadro de verificación Place Code in separate file.

clip_image008

Esto nos crea un simple archivo con extensión .ascx dentro de nuestro proyecto ASP.NET. A estas alturas podremos realizar cualquier funcionalidad ASP.NET. Solo hay que asegurarnos de no generar dependencias a otras carpetas como App_Code, tratemos de generar todo el código y funcionalidad sobre el Web User Control. En mi caso usare las características de vinculación de controles de ASP.NET para crear el más humilde de los GridView de ASP.NET. Podemos crear una página Defaullt.aspx para probar el funcionamiento del mismo. A continuación agregare un cuadro de texto , un botón y un label.

clip_image010

El resultado es un código Markup que podría tener sin duda código C#. En la sección de Script runat=”Server” estarían los eventos disparados por los controles de nuestro Web User Control. Solo que para propósitos de este ejemplo quiero hacer que los eventos sean disparados desde un WebPart de SharePoint y no necesariamente desde aquí.

A continuación en nuestro proyecto SharePoint agregamos un elemento de tipo Template, el cual nos creara un archivo dentro de la ruta interna de archivos de SharePoint o más conocida como 12 hive “C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12”.

clip_image012

Eliminamos el archivo generado TemplateFile.txt y agregamos la carpeta CONTROLTEMPLATES y dentro la carpeta ASPNETWebParts. Esto permite incluir en nuesdttro paquete de deployment generado por nuestro proyecto SharePoint una nueva carpeta que será aprovisionada de forma confiable en la ruta 12 hive de cada Web Front End de la granja SharePoint. Agregara una nueva carpeta llamada ASPNETWebParts. Dentro de esta carpeta agregaremos como elemento existente nuestro archivo .ascx. El resultado es algo asi:

clip_image014

Ya casi terminamos, a continuación agregamos el código de un WebPart de SharePoint que nos permitirá cargar en tiempo de ejecución el .ascx recién desarrollado. Dentro de nuestro proyecto ASPNETWebPart damos clic derecho y agregamos un nuevo elemento de tipo Web Part bajo el nombre ASPNETWebPart. En realidad puede ser cualquier nombre.

clip_image016

Abrimos el código de nuestro WebPart y agregaremos lo siguiente:

  1. Una variable miembro de tipo UserControl, esta se utilizara como un placeholder de todo el ASPNETWebUserControl.ascx.
  2. Sobre escribimos el método Render para escribir en el flujo de salida de nuestro WebPart el contenido del WebUserControl.
  3. Múltiples variables miembro que representan cada uno de los controles que existen en nuestro archivo ASPNETWebUserControl.ascx
  4. En el evento CreateChaldControls hacemos una instancia de UserControl mediante Page.LoadControl y de cada uno de los controles;

Básicamente podremos tener el control de la funcionalidad desde el WebPart y esto facilita el hacer uso del modelo de objetos de SharePoint para leer datos de otras listas o hacer querys que podamos usar para después presentarlos en el Web User Control.

using System;

using System.Runtime.InteropServices;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Xml.Serialization;

using Microsoft.SharePoint;

using Microsoft.SharePoint.WebControls;

using Microsoft.SharePoint.WebPartPages;

namespace ASPNETWebPart

{

[Guid("7625d718-fb33-4bbc-b05f-2f1ff0dd4a88")]

public class ASPNETWebPart : System.Web.UI.WebControls.WebParts.WebPart

{

public ASPNETWebPart()

{

this.ExportMode = WebPartExportMode.All;

}

protected override void Render(HtmlTextWriter writer)

{

this.ascxControl.RenderControl(writer);

}

UserControl ascxControl;

Button button1;

TextBox textbox1;

Label label1;

GridView gridView1;

protected override void CreateChildControls()

{

base.CreateChildControls();

ascxControl = (UserControl)Page.LoadControl(@"/_controltemplates/ASPNETWebParts/ASPNETWebUserControl.ascx");

button1 = (Button)this.ascxControl.FindControl("Button1");

textbox1 = (TextBox)this.ascxControl.FindControl("TextBox1");

label1 = (Label)this.ascxControl.FindControl("Label1");

gridView1 = (GridView)this.ascxControl.FindControl("GridView1");

button1.Click += new EventHandler(button1_Click);

this.Controls.Add(ascxControl);

}

void button1_Click(object sender, EventArgs e)

{

label1.Text = textbox1.Text;

}

}

}

El resultado:

clip_image018

Originalmente publicado en msmvps.com