JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Transferencia de información entre páginas llamadas en secuencia

Un problema que se plantea muchas veces a los programadores de ASP.NET y que, normalmente, les cuesta solucionar es el siguente:

Disponemos de una página que realiza determinadas consultas a una base de datos o recopila un volumen relativamente grande de información en su código. Tras procesarla (o en un PostBack) debemos llamar a otra página ASPX que debe utilizar la misma información costosa de obtener. ¿Qué hacemos?

Existen muchas posibles soluciones, sólo que la mayoría no nos sirven de mucho o presentan muchos problemas. Entre otras tenemos las siguientes, que seguramente serían las que intentaría un programador de ASP clásico:

  1. Hacemos que la segunda página vuelva a recuperar los mismos datos. En fin, no arreglamos nada así.
  2. Metemos la información en un campo oculto de un formulario y lo enviamos por POST a la siguiente página. Esto es aún peor. Tiene un costo alto de ancho de banda y velocidad de descarga, es muy propenso a errores y problemas de seguridad y no es adecuado tampoco para muchos tipos de datos.
  3. Usamos una variable de sesión para almacenar los valores entre ambas páginas. Es tal vez el menos problemático (depende de cómo se almacene esta información en Sesión, recuerda, un RecordSet o una matriz no se deben almacenar en sesión pues disminuye mucho la escalabilidad). Sin embargo tiene muchas pegas también, como que por ejemplo hay que gastar memoria de manera innecesaria, pueden quedar valores "flotando" por ahí si el lfujo de las páginas no es el correcto o se nos escapa eliminar la información cuando no se necesite, etc...

La solución en ASP.NET es mucho más interesante. Se trata de utilizar el método Server.Transfer. Con él ejecutaremos la página siguiente desde el mismo contexto que la actual que contiene los datos calculados. Y ahora, ¿cómo se obtiene acceso a dichos datos?. Muy fácil obteniendo una referencia a la página original (desde la que se transfiere el control) mediante el objeto Context, y accediendo a sus miembros de manera normal. Lo explicaré con un ejemplo.

Imaginemos que la página 'pag1.aspx' obtiene un DataSet con muchos datos a partir de una consulta compleja a la base de datos y que luego estos mismos datos deben pasarse a otra página 'pag2.aspx' que debe hacer uso de ellos también. Este DataSet lo almacenamos en un campo público que añadimos a tal efecto a la página llamado por ejemplo, 'datos':

pag1.aspx:

public Class pag1 : Page
{
....
public DataSet datos = null;
....
....
//Se obtiene el DataSet y se almacena...
this.datos = ObtenDataSetComplejo();
...
}

Ahora para ejecutar la siguiente página, por ejemplo al pulsar un botón, se escribiría lo siguiente:

pag1.aspx:

Server.Transfer("pag2.aspx");

En la página 2 obtenemos una referencia a la página 1 (se supone que están en el mismo espacio de nombres) y ya podemos acceder a los datos con el código siguiente:

pag2.aspx:

pag1 paginaAnterior = (pag1) Context.Handler;
DataSet losDatos = paginaAnterior.datos;

Así de fácil. este truco es relativamente poco conocido, incluso por programadores experimentados, y ayuda a disminuir los errores y a ganar rendimiento y memoria en traspasos de información entre páginas de ASP.NET: Que lo disfrutes.

José Manuel Alarcón
Banner

Comentarios (2) -

Hola buenas, gracias por el artículo.

Mi duda es la siguiente:
Si lo que quiero es obtener los datos que se introdujeron en la página anterior ¿sería de la siguiente manera?

   string email = ((TextBox)paginaAnterior.Form.FindControl("txtEmail")).Text;
  
¿Es la manera correcta? ¿Es segura la transferencia entre las 2 páginas?

Un saludo, y muchas gracias por la información.

Responder

Spain José Manuel Alarcón

Hola Toninet,

La transferencia entre páginas es segura, y desde luego más segura que pasar simplemente la información de una a otra usando los métodos que comento al principio.

Te recomiendo que le eches un vistazo a mi serie de posts, más recientes, relacionados con este titulada "Pedir una cosa y recibir otra":

www.jasoft.org/.../...ect-y-RedirectPermanent.aspx

En una de las partes que forman parte de la serie se trata con más detalle el tema de la transferencia entre páginas, se dan otras alternativas y se ven sus limitaciones.

Saludos,

Responder

Agregar comentario