SharePoint 2010: Cancelación de eventos y páginas de error personalizadas!

Hace unas semanas os comentaba algunas de las novedades que tenemos en SharePoint 2010 en torno a los eventos disponibles para Listas y Bibliotecas en SharePoint 2010. Además de estas novedades, SharePoint 2010 introduce la capacidad de cancelar eventos y redirigir al usuario a una página de error personalizada evitando la clásica página de error poco amigable de cara al usuario final y apenas personalizable. Esta capacidad únicamente está disponible en los eventos de tipo síncrono y en la interfaz de usuario de SharePoint. Veamos como funciona.

Creando la solución

Lo primero que vamos a hacer para demostrar estas novedades es crear un proyecto vacío de SharePoint 2010 utilizando las nuevas plantillas disponibles para ello en Visual Studio 2010. A continuación, seguimos los siguientes pasos:

  • En el asistente de personalización de SharePoint especificamos la Url de la Colección de Sitios que vamos a utilizar para cuestiones de depuración y despliegue inicial de la solución. Elegimos como opción de despliegue Deploy as a farm solution y pulsamos Finish.
  • En el explorador de soluciones de Visual 2010 seleccionamos el nombre del proyecto, hacemos clic con el botón derecho del ratón y pulsamos la opción Add –> Add SharePoint “Layouts” Mapped Folder. Como seguramente sabréis, las herramientas para desarrollo en SharePoint 2010 de Visual Studio 2010 permite mapear de forma sencilla carpetas ubicadas en el directorio 14 de instalación de SharePoint 2010 lo que facilita mucho el desarrollo de soluciones ya que podemos abstraernos de conocer en detalle estas rutas.
  • Una vez añadida esta carpeta mapeada, comprobaréis que dentro de layouts se ha creado una carpeta con el nombre del proyecto. La razón de esto es muy sencilla: se trata de evitar posibles conflictos con archivos que se puedan llamar igual dentro del directorio layouts y también por cuestiones de organización.
image image image
  • A continuación añadimos dentro de la carpeta contenida en Layouts una página de aplicación. Para ello, seleccionamos dicha carpeta, hacemos clic con el botón derecho del ratón y pulsamos Add – Add New Item…En la ventana de tipos de elementos disponibles elegimos  Application Page.
  • Tras pulsar el botón Add, el nuevo elemento se añade al proyecto y se muestra la vista de markup de la página de aplicación.
  • Por supuesto, esta página personalizada la podemos configurar de acuerdo a nuestras necesidades.
  • Una vez añadida la página personalizada, vamos a añadir al proyecto un manejador de eventos. Para ello seleccionamos un elemento de tipo Event Receiver dentro de los disponibles
image image  image
  • En el asistente de creación del manejador de eventos elegimos la Lista con la que queremos trabajar y el tipo de evento. En mi caso he seleccionado la lista Calendar y el evento síncrono An item is being Added. Pulsamos Finish para concluir el asistente.

image

  • En la vista de código del manejador es dónde vamos a especificar que queremos que el evento se cancele y que utilice la página de error personalizada. Un ejemplo tonto podría ser el siguiente:

        public override void ItemAdding(SPItemEventProperties properties)  

        

           if (properties.UserDisplayName.ToLower() == “administrator”)  

            

               properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;  

               properties.RedirectUrl=”~/_layouts/SPCustomErrorPage/SPCustomErrorPage.aspx”;  

            

        

Probando la solución

Una vez compilado el proyecto y guardados los cambios, ya estaríamos listos para probar la solución sin más que desplegarla. Pero antes de hacer ninguna prueba, merece la pena detenerse por las novedades en lo que a despliegue de artefactos de SharePoint 2010 se refiere:

  • Si os habéis fijado en el explorador de soluciones de Visual Studio 2010, veréis que a la estructura clásica de proyecto se han añadido dos nodos: Feature y Package.
  • El primero de los nodos contiene la característica o características que forman parte del proyecto (podemos tener tantas como queramos). Lo interesante de este nodo es que es Visual Studio quien de forma automática genera la característica por nosotros tan pronto como se añade un SPI (SharePoint Project Item). En este caso, se ha creado una característica relativa al manejador de eventos añadido. Además, configurar una característica es realmente sencillo gracias al diseñador de características que nos permite realizar esa tarea de forma visual o bien utilizar el editor XML (para usuarios más avanzados). En este caso, la característica contiene el manejador de eventos creado, pero puede contener elementos como Web Parts, Flujos de trabajo, etc.
  • El segundo de los nodos relevantes es el de package que contiene el paquete que representa a nuestra solución. Este nodo es el que nos permite agrupar las características disponibles para generar una solución .WSP única. De nuevo, este trabajo se simplifica de manera notable con el nuevo diseñador de paquetes disponible en Visual Studio 2010. Sólo puede haber un paquete por solución y este paquete incluye las características que se consideren y otros elementos como carpetas mapeadas (como es el caso).
  • Finalmente, para desplegar nuestra solución no tenemos más que seleccionar el nombre del proyecto y pulsar sobre la opción Deploy,
image image image
  • Para probar que la cancelación con página de redirección funciona, no tenemos más que ir a la lista de Calendario y tratar de añadir un elemento. Como se cumple la condición del manejador, al pulsar el botón Guardar seremos redirigidos a la página personalizada de error (Nota: Como alguno seguro que se dará cuenta, la captura de pantalla final está hecha en otra máquina virtual porque cuando llevas una temporada trabajando con SahrePoint 2010 y Visual Studio 2010, de repente empiezan a fallar cosa que antes funcionaban).
image image

Y hasta aquí llega lo que os quería contar sobre las novedades en cancelación de eventos y páginas de error personalizadas.

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.

8 comentarios en “SharePoint 2010: Cancelación de eventos y páginas de error personalizadas!”

  1. Hola.

    Antes que nada, muchas gracias por toda la ayuda que das através de tus valiosos artículos.

    Tengo un problema y es que, aunque tenga definido el eventhandler y debuggando se me detiene en la entrada del evento, no me redirecciona a la página que yo le indico, sino que la hace SIEMPRE a la “tipica” del error de Sharepoint:

    Error

    Un receptor de eventos ha cancelado la solicitud.
    Solución de problemas de Microsoft SharePoint Foundation.

    Volver al sitio

  2. Hola!
    Aségurate que el manejador de eventos es de tipo síncrono y de que estás poniendo de forma correcta la Url de redirección.

    Un saludo

  3. Hola Juan Carlos.

    El evento está asociado para cuando se desea borrar un elemento de una lista:

    public override void ItemDeleting(SPItemEventProperties properties)
    {
    properties.Cancel = true;
    properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
    properties.RedirectUrl = “http://www.google.com”;
    }

    Muchas gracias!!!!

  4. Hola,
    El problema está claro: como tienes properties.Cancel=true; y luego properties.Status=SPEventReceiverStatus.CancelWithRedirectUrl;, no se está haciendo la cancelación con redirección…la solución pasa por quitar el properties.Cancel=true;

    Saludos

  5. Hola Juan Carlos.

    Antes que nada, muchisimas gracias por tu rápida respuesta.

    Siento decir que también he probado con poner solamente las 2 últimas lineas y sigue sin funcionar.

    Tambien he probada con poner al principio la linea siguiente:
    -> “base.ItemDeleting(properties);”

    Vamos, que creo que he hecho todas las combinaciones posibles. 8^(

    Saludos muy cordiales

Deja un comentario

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