Una de las características que los desarrolladores de ASP.NET 1.x necesitábamos en el ambiente de desarrollo era que cuando se navegaba de una página a la siguiente; en la siguiente página se pudiese recuperar los valores de la página y de los controles que se encuentran en ella. Esto es posible en ASP.NET 2.0 y 3.5, y es realmente un proceso muy simple.
Para demostrar esto, primero crear una página llamada Page1.aspx simple como esta:


Aquí se puede identificar claramente un objeto Textbox para capturar el nombre, un objeto Calendar para capturar la fecha de vuelo, un objeto Button para postear la página a sí misma (Page1.aspx), un objeto Button para postear la página hacia otra página distinta (Page2.aspx) y un objeto Label para mostrar la información cuando la página es posteada a sí misma.
Es importante notar que el objeto Button2 tiene un atributo llamado PostBackUrl cuyo valor es la página hacia la cual se va a postear cuando este botón sea presionado.
Este código debe ser agregado a la página Page1.aspx para implementar el comportamiento del objeto Button1 cuando es presionado:

En este momento es posible correr la aplicación y ver lo que hace el primer botón:

Este es el comportamiento tradicional, cualquier página creada en ASP.NET 1.0/1.1 simplemente era posteada contra sí misma, y se podía manejar los valores de los controles dentro de la instancia de la página. El objeto Button2 puede hacer visibles los valores de la página y los controles de Page1.aspx dentro de Page2.aspx; de tal forma de Page2.aspx puede acceder a estos valores desde cualquier parte. Esta es la forma en la cual tiene que estar implementada la página Page2.aspx:

Existen dos formas de recuperar los valores de la página anterior. La primera es usando el método FindControl de la propiedad PreviousPage usando el texto del nombre del control de la página anterior como parámetro, haciendo el casting correspondiente para asignarlo a una variable local. De esta forma nos podemos olvidar de la página anterior y trabajar con la variable local como siempre. Pero como mencioné anteriormente, existe otra forma de hacerlo...
Para hacer esto es necesario exponer los controles de la página anterior (Page1.aspx) como propiedades públicas de esta forma:
Ahora es posible referirse a estas propiedades desde la página Page2.aspx. Para hacer esto es importante incluir la directiva PreviousPageType (Línea 2) y el valor del atributo VirtualPath debe ser el nombre de la página anterior. Una vez hecho esto se puede acceder a los controles de la página anterior desde la propiedad PreviousPage:

Cuando ejecutamos esta aplicación seleccionando "Submit page to Page2.aspx", el resultado será el siguiente:

Finalmente, que pasaría si alguien accede a la página Page2.aspx sin antes haber pasado por la página Page1.aspx?. Pues, es fácil determinar si una petición está llegando desde Page1.aspx o si alguien accedió a la página Page2.aspx directamente. Se puede trabajar sobre el objeto Request a través del uso de la propiedad IsCrossPagePostBack la cual es similar a la propiedad IsPostBack de ASP.NET 1.x. La propiedad IsCrossPagePostBack permite verificar si el request viene desde Page1.aspx
Saludos!
Carlos Figueroa - Quito, Ecuador