Modificar el comportamiento de redirección de los formularios NewForm.aspx y EditForm.aspx (I)

Este artículo forma parte de una serie de tres, donde indicaremos cual es el comportamiento de redirección de NewForm.aspx y EditForm.aspx, como modificar su comportamiento, como empaquetarlo en una feature y en una solución, y por último como registrarlo para que únicamente funcione con una lista en concreto.

En el artículo de hoy vamos a estudiar la lógica de redirección que tienen establecidos los formularios de inserción y modificación de datos por defecto: NewForm.aspx y EditForm.asp.

La situación actual es la siguiente:


  • NewForm.aspx  => Al guardar los datos => Va a la vista por defecto, en la mayoría de los casos, la página de AllItems.aspx
  • EditForm.aspx => Al guardar los datos => Va a la vista por defecto, en la mayoría de los casos, la página de AllItems.aspx

Análisis del comportamiento:

Cuando trabajamos con un formulario, la lógica que sigue para saber a qué página redirigir al usuario cuando se pulsa el botón de guardar (dependiendo del caso) es la siguiente:


  1. SPList.DefaultViewURL: Al pulsar el botón de guardar de un formulario de tipo NewForm.aspx o EditForm.aspx, si no especificamos nada más (ningún parámetro), nos redirige a la vista predeterminada, cuyo valor podríamos encontrar en el modelo de objetos a través de la propiedad SPList.DefaultViewUrl
  2. Parámetro SOURCE: En el caso de que en la URL que llama al formulario NewForm.aspx o EditForm.aspx, le especifiquemos el parámetro SOURCE, al cerrar la página, seremos redirigidos a la dirección indicada en ese parámetro.


Por ejemplo la URL: http://miempresa.es/Lists/Tareas/NewForm.aspx?RootFolder=%2FLists%2FTareas&Source=http%3A%2F%2Fmiempresa%2Ees%2FLists%2FTareas%2FAllItems%2Easpx nos llevará a la página de AllItems.aspx,


mientras qué la siguiente URL: http://miempresa.es/Lists/Tareas/NewForm.aspx?RootFolder=%2FLists%2FTareas&Source=http%3A%2F%2Fmiempresa%2Ees%2FLists%2FTareas%2FDispForm%2Easpx nos llevará a la página indicada en el parámetro Source, en este caso DispForm.aspx.


Una prueba que podéis realizar es llamar al formulario metiendo en la barra de dirección del navegador una URL, con distintos valores para el parámetro Source, y observaréis como os redirige a la dirección proporcionada por el parámetro.

Un ejemplo sería: http://miempresa.es/Lists/Tareas/EditForm.aspx?RootFolder=%2FLists%2FTareas&Source=http%3A%2F%2Fmiempresa%2Ees%2FLists%2FDispForm%2Easpx (que nos mostraría el formulario de DispForm.aspx, pero no nos mostraría ningún ítem en concreto ya que no le hemos proporcionado el parámetro ID)

Planteamiento del problema

En el caso de que nos plantearan el siguiente objetivo, lograr que:


  • NewForm.aspx  => Al guardar los datos queremos que vaya al => DispForm.aspx?ID=xx del elemento que se acaba de crear
  • EditForm.aspx?ID=xx => Al guardar los datos queremos que vaya al =>DispForm.aspx? ID=xx del elemento que se acaba de editar

Alternativas de implementación


Nos podríamos plantear las siguientes aproximaciones para resolver el problema:


Primera aproximación: Utilizando el parámetro Source:


Podríamos intentar obtener este comportamiento, utilizando el parámetro SOURCE. Sin embargo, los problemas que existen con esta aproximación son los siguientes:


  • Habría que modificar la URL llamante, que está definida en el menú desplegable “Nuevo elemento” o “Editar elemento”, para que incorporara el parametro SOURCE deseado, y no es tarea fácil.  

          Nuevo Elemento


         Editar Elemento


 



  • Para pasar de las páginas NewForm.aspx/EditForm.aspx a la página DisplayForm.aspx necesitamos conocer el ID, del elemento que queremos mostrar. En el caso de que la página origen fuera EditForm.aspx?ID=xx, se podría obtener el valor del ID de la propia URL y llegar a ponerlo en el parámetro SOURCE, pero en el caso de que la página origen fuera NewForm.aspx, el ID no se genera, ni se conoce hasta que no se crea el elemento, por lo que no sería posible ponerlo en le parámetro SOURCE de la URL llamante.

Segunda aproximación: Modificando el valor de la propiedad SPList.DefaultViewUrl:

Otra aproximación sería intentar modificar por código el valor de la propiedad SPList.DefaultViewUrl. En este caso sería necesario modificar la página para que incluyera el código necesario para cambiar el valor de esta propiedad.

Un ejemplo del código a utilizar podría ser:





        //Primero obtenemos la lista con la que vamos a trabajar
        SPSite miSiteCol = new SPSite(http://miempresa);
        SPWeb miWeb = miSiteCol.OpenWeb();
        SPList miLista = miWeb.Lists[new Guid(“Introducir aqui Guid de la lista”)];

        // A continuacion obtenemos la coleccion con las  vistas de esa lista
        SPViewCollection miViews = miLista.Views;

        // Seleccionamos la vista de tipo AllItems.aspx
        SPView AllItemsView = miViews[“All Items”];

        // Creamos una nueva vista denominada MiNuevaVista basada en la vista AllItems.aspx 
        // y especificamos que sea la vista por defecto
        // SPView.Clone(string strNewViewName, uint iRowLimit, bool bPaged, bool bMakeViewDefault)
        SPView nuevaView = AllItemsView.Clone(“MiNuevaVista”,10,true,true);

Este código es válido si queremos cambiar la vista por defecto a la que van los formularios cuando les damos a guardar, pero seguimos teniendo dos problemas.


El primero, consiste en que las vistas que podemos crear y añadir a la coleccion de vistas mediante SPView.Clone() o SPViewCollection.Add(), en principio parece que deben de ser del tipo SPView (definidas mediante CAML y interpretadas por la ListViewWebPart), por lo que parece dificil incluir mediante esos métodos páginas como DispForm.aspx.


Aunque fuera posible solventar el problema anterior, sin embargo el mayor problema estriba al igual que en la primera aproximación (el del parámetro SOURCE), en que para poder redirigir a la página con la información del ítem DispForm.aspx?ID=xx, es necesario conocer su ID y proporcionárselo. En el caso de la transición desde NewForm.aspx a DispForm.aspx, la página NewForm.aspx, desconoce que ID, le va a asignar el sistema al ítem, hasta que éste no es guardado.


Tercera aproximación: Mediante código JavaScript

Otra posible solución sería intentar realizar la redirección mediante código JavaScript, pero seguimos teniendo el mismo problema que en el caso anterior ya que en el caso de la página NewForm.aspx, desconocemos el ID que el sistema va asignar al ítem hasta que este no es guardado.

Cuarta aproximación: Mediante un manejador de eventos

Por último, la solución que encontramos más recomendable para este problema consiste en implementar un manejador de eventos, que capture el evento síncrono de ItemAdding (cuando se quiere añadir un ítem a la lista), realice la adición de este ítem a la lista y por último realice la redirección a una determinada dirección, pero conociendo ya el ID que se le ha asignado a este ítem.

Para ello será necesario:


  1. Crear una clase que herede de la clase SPItemEventReceiver
  2. Sobreescribir los métodos ItemAdding y ItemUpdating de dicha clase.

    • Obtener la referencia a la lista y al SPListItem con el que se va a trabajar
    • Deshabilitar el disparo de nuevos eventos
    • Añadir/actualizar el item en la lista
    • Volver a habilitar el disparo de eventos
    • Realizar la redirección
    • Tratar las excepciones.

En el siguiente artículo de esta serie mostraremos y explicaremos con un ejemplo de código, como implementar esta funcionalidad.

Un comentario en “Modificar el comportamiento de redirección de los formularios NewForm.aspx y EditForm.aspx (I)”

  1. Buenas Ángel!
    Genial explicación…está todo muy claro en cuanto a que alternativas tenemos para modificar la redirección de formularios en SharePoint!

    Un abrazo

    JC’s

Deja un comentario

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