WebPart para Sharepoint 2007 usando UserControl

En el artículo anterior explicamos cómo usar el control de Sharepoint 2007 PeopleEditor y desarrollamos un formulario para colocarlo en Sharepoint.
En realidad lo que construimos fue una WebPart utilizando un UserControl la cual registramos en nuestro Sharepoint y utilizamos. Cuando necesitamos agregar funcionalidad adicional a nuestros sitios de Sharepoint recurrimos a la codificación mediante WebParts, las cuales nos permiten desarrollar dicho componente e incluirlo en nuestro portal Sharepoint. Pero todo sabemos que la codificación de una WebPart no es trabajo fácil y más cuando nos tenemos que preocupar de todo el dibujo (renderización de los controles incluidos en la misma) y el manejo de los preciados eventos, cuando la WebPart es sencilla no es tan complicado su desarrollo, pero ahora si lo que debemos codificar es un formulario complejo, el desarrollo de la misma no es nada trivial.
Nosotros vamos a desarrollar una WebPart, pero en vez de codificarla toda en la clase que implementa la clase base WebPart, lo vamos hacer mediante un UserControl de Asp.Net. Lo primero que tenemos que hacer es preparar nuestro ambiente en Visual Studio, para lo cual necesitamos 2 proyectos, un proyecto Web donde codificaremos el UserControl y un proyecto de Clases donde codificaremos nuestra WebPart, en la siguiente imagen se puede ver como quedaría nuestro ambiente:

Imagen 1

Lo que debemos hacer ahora es configurar nuestros dos proyectos, para poder agregar la referencia al proyecto de biblioteca de clases. Ambos dos proyectos deben estar firmados con un Strong Name (archivo snk, si tienen uno en común para todos sus desarrollos pueden utilizarlo, si no pueden generar uno con el Visual Studio), el primer proyecto que vamos a configurar es la biblioteca de clases y en las propiedades del proyecto vamos a colocar en archivo snk (Strong Name) en la sección correspondiente a firma del Visual Studio, como se puede ver en la imagen siguiente:

Imagen 2

Por último en la clase AssemblyInfo vamos agregar una elevación en los permisos de ejecución de nuestra WebPart para que la misma se ejecute sin ningún problema en nuestro portal de Sharepoint 2007, para eso agregamos el siguiente atributo en nuestro AssemblyInfo [assembly: AllowPartiallyTrustedCallers()], en la siguiente imagen vemos como quedaría:

Imagen 3

Una vez configurado nuestro proyecto de biblioteca, lo que demos hacer es configurar nuestro proyecto Web y crear el UserControl correspondiente, para lo cual vamos agregar un nuevo componente a dicho proyecto del tipo UserControl y lo vamos a grabar en el mismo. Una vez agregado lo que demos hacer es codificar el mismo según nuestras necesidades y requerimientos. En la imagen 4 vemos nuestro UserControl codificado, como nos estamos basando en el artículo anterior, nuestro UserControl simplente dibuja el control de Sharepoint PeopleEdito.

Imagen 4

En la clase asociada a dicho UserControl vamos a codificar todo nuestro comportamiento para el mismo. Una vez que está terminado tenemos que publicarlo así podemos crear el Assembly necesario para dicho UserControl, para ello nos paramos sobre nuestro proyecto Web y seleccionamos publicar. En la nueva ventana que aparece en nuestro Visual Studio vamos a configurar como vamos hacer la publicación, debemos seleccionar una ruta donde se colocaran los archivos generados, vamos a indicarle que nos genere un Assembly independiente para cada uno de los archivos que tenemos en el proyecto Web y vamos a firmar los mismo con un Strong Name (el archivo snk a utilizar puede ser el mismo que utilizamos para firmar la biblioteca de clases), la imagen 5 nos muestra como quedaría la pantalla configurada.

Imagen 5

Una vez publicado, vamos agregar la referencia al Assembly generado por el proceso de publicación en nuestro proyecto de clases, nuestro proyecto de clase debería quedar como se muestra en la siguiente imagen.

Imagen 6

Los ultimo que vamos hacer es codificar nuestra WebPart para utilizar el UserControl utilizando el método LoadControl y pasándole una ruta a la ubicación de nuestro archivo ASCX, esta ruta deberá ser una ruta relativa en la raíz de nuestro portal Sharepoint, en nuestro caso colocamos el archivo ASCX en una carpeta llamada “UserControl” como se puede ver en la siguiente imagen.

Imagen 7

En la siguiente sección entraremos el código necesario para cargar el UserControl en la WebPart y adicionarlo a la colección de controles. También hemos incorporado un manejo de errores que nos permitirá enviar el mensaje de error producido a la pantalla utilizada por Sharepoint 2007 para mostrar los mensajes de error.

Sección 1
using System;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;
using Microsoft.SharePoint.Utilities;

namespace PeopleEditorWebControlWebPart
{
public class PeopleEditorWebControlWebPart : System.Web.UI.WebControls.WebParts.WebPart
{
private PeopleEditorWebControlUC mPeopleEditorWebControlUC = null;
private Exception mError = null;
private string mSourceQuery = string.Empty;

public PeopleEditorWebControlWebPart()
{
this.ExportMode = WebPartExportMode.All;
}
protected override void CreateChildControls()
{
try
{
base.CreateChildControls();
mPeopleEditorWebControlUC = (PeopleEditorWebControlUC)Page.LoadControl(@”/UserControl/PeopleEditorWebControlUC.ascx”);
Controls.Add(mPeopleEditorWebControlUC);
}
catch (Exception ex)
{
mError = ex;
}
}
protected override void Render(HtmlTextWriter writer)
{
if (mError != null)
{
SPUtility.TransferToErrorPage(mError.Message + ” —> ” + mError.StackTrace);
}
base.Render(writer);
}
}

}

Por último nos queda compilar nuestra WebPart y registrarla en nuestro portal de Sharepoint para poder utilizarla, como cualquier otra Webpart.

Fabián Imaz
Siderys Elite Software

Compartir
4 Comments
    • Anónimo
    • 12 febrero, 2008

    Hola el articulo me parecio super bueno lo estoy tratando de aplicar en sharepoint services 3.0 pero al publicarlo ytratar de ponerlo en una pagina me genera erro dice que no puede importar, me podrias ayudar con esto ? gracias

  1. Hola,

    Ese error te da cuando estas por subir la WebPart a Sharepoint?
    Si es así fijate que la WebPart este bien y que la configuración de la misma esta OK.
    Si no te pido que me indiques bien donde te esta dando el error para poder reproducirlo.
    Saludos,
    Fabián Imaz

    • Anónimo
    • 18 abril, 2010

    Hola. El articulo es muy bueno, pero tengo un pequeño error al momento de ejecutar la webPart.

    indica el siguiente error:

    Could not load the assembly '…' . Make sure that it is compiled before accessing the page.

    Podras ayudarme con eso ?

  2. Hola,

    El error podría deberse a que debes registrar en la directiva el assembly donde se implementada la clase que del codebehiend del control, es decir, en la directiva @Control en el atributo CodeFile debes poner el nombre del assembly con la siguente convención CodeFiel="Clase,Assembly" ten en cuenta que la clase debe estar con su full name es decir con su espacio nombre incluido.

    Saludos,