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.

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA