ASP.NET y la navegación entre páginas

Cuando trabajamos con ASP.NET lo mas normal es que nuestra aplicación este dividida en mas de un WebForm.
Esto conlleva que en más de una ocasión necesitaremos ir de una página a otra, y para realizar esa "navegación", tenemos opciones claramente diferenciadas:
Server.Transfer(): +1 Sobrecargas
Finaliza la ejecución de la página actual y comienza la ejecución de una nueva página para la solicitud actual.
Response.Redirect(): +1 Sobrecargas
Redirecciona un cliente a una nueva dirección URL. Especifica la nueva URL y si la ejecución de la página actual debe finalizar.
Server.Execute(): +1 Sobrecargas
Ejecuta la solicitud actual utilizando otra página ubicada en la ruta de acceso a la dirección URL especificada.
Los comportamientos de estas tres opciones pueden parecer similares a priori, pero si nos sumergimos un poco más en su funcionamiento veremos en que contexto debe usarse cada una.
Server.Transfer()
Al ejecutar este método se abandonará la página actual y se navegará a la introducida en el parámetro. Al realizarse esta operación, no se mostrará la URL de la nueva pagina, si no que se mantendrá la actual. Lo que "ocultara" de cara al usuario la ubicación de la página en la que se encuentra.
Su característica mas destacada, es que si utilizamos su sobrecarga podemos decirle si va a mandar el conjunto de controles que tenemos en la principal.
Server.Transfer("pagina2.aspx",true)
Si por ejemplo teníamos un formulario con un TextBox en la página principal, ahora podemos acceder al texto que contenía cuando se hizo la navegación. Para ello utilizaremos el nombre o el índice del control (hay que tener en cuenta, que si el control no existe, al intentar obtenerlo devolverá una excepción.):
\r\n
string cadena = Request.Form["NombreControl"];
string cadena = Request.Form[indice];
Otra de las peculiaridades de este método, es que como la redirección conlleva enviar objetos de servidor, no permite redirigir a URL\’s ajenas a la aplicación (como a Google o sucedáneos) ni a URL’s de HTML plano incluso si están incluidas dentro de la aplicación. Por tanto si fuera necesario, deberíamos crear un WebForm.aspx estándar e incluir dentro el HTML que necesitemos.
Response.Redirect()
Al ejecutar este método se abandonará la página actual y se navegará a la página introducida por parámetro, permitiendo además la posibilidad de que se mantenga la ejecución de esa página.
Es decir, ante dos botones con un código como este:
private void btnRedirigir_Click(object sender, System.EventArgs e) {
Response.Redirect("prueba.aspx",false);
Session["nombre"] == “Texto”;
}
private void btnRedirigir2_Click(object sender, System.EventArgs e){
Response.Redirect(”prueba.aspx”);
Session["nombre"] == “Texto”;
}
Al llegar al Page_Load de la página prueba.aspx, veremos que si habíamos pulsado el primer botón, tendremos almacenado en Session["nombre"] la cadena "Texto", mientras que si se utilizó el segundo botón ese objeto de sesión no existe.
Además de esto, se puede utilizar la redirección utilizando las variables por URL (como las $_GET de PHP). Es tan simple como crear la string con esas variables ya incluidas.
string querystring = "prueba.aspx?p=" + variable1.ToString() + "&q=" + variable2.ToString();
Response.Redirect(querystring);
Estas se almacenan en la Request y se puede acceder a ellas fácilmente:
int valor1 = Convert.toInt32(Request.Params["p"]);
int valor2 = Convert.toInt32(Request.Params["q"]);
Al igual que cuando se almacenan objetos en sesión, hay que realizar un casting ya que todo se guarda como object.
Al contrario que el Server.Transfer, este método si permite redirigir a una página externa (como un hipervínculo) y si que se ve la URL de la página al cargarse.
Server.Execute()
Esta es la opción menos recomendada, ya que no redirige físicamente, si no que ejecuta el código de la segunda pagina dentro de la primera. Su uso más habitual se basa en insertar un control de tipo Literal en la página principal, y ejecutar una segunda página a través de un StringWriter (que requiere un añadir un using del namespace System.IO), y que el resultado se almacene en el Literal. Por ejemplo:
StringWriter sw = new StringWriter();
Server.Execute(”prueba.aspx”,sw);
this.Literal1.Text = sw.ToString();
Si en prueba.aspx almacenamos el código de un Input TextBox y un Input Button dentro de un Panel, al ejecutar ese método obtendremos ese mismo conjunto de controles sin tener que ir físicamente a la página.










