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