<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>El cajón desastre &#187; ASP</title>
	<atom:link href="http://www.dubasdey.com/category/programacion/asp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dubasdey.com</link>
	<description></description>
	<lastBuildDate>Tue, 02 Jun 2009 14:25:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ASP.NET y la navegaci&#243;n entre p&#225;ginas</title>
		<link>http://www.dubasdey.com/2007/06/18/aspnet-y-la-navegacin-entre-pginas/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=aspnet-y-la-navegacin-entre-pginas</link>
		<comments>http://www.dubasdey.com/2007/06/18/aspnet-y-la-navegacin-entre-pginas/#comments</comments>
		<pubDate>Mon, 18 Jun 2007 13:33:31 +0000</pubDate>
		<dc:creator>Manuel Cernuda</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dubasdey.com/2007/06/18/aspnet-y-la-navegacin-entre-pginas/</guid>
		<description><![CDATA[
Cuando trabajamos con ASP.NET lo mas normal es que nuestra aplicaci&#243;n este dividida en mas de un WebForm.
Esto conlleva que en m&#225;s de una ocasi&#243;n necesitaremos ir de una p&#225;gina a otra, y para realizar esa &#34;navegaci&#243;n&#34;, tenemos opciones claramente diferenciadas:
Server.Transfer(): +1 Sobrecargas

Finaliza la ejecuci&#243;n de la p&#225;gina actual y comienza la ejecuci&#243;n de una [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://www.dubasdey.com/wp-content/uploads/2007/04/asplogo.gif' alt='ASP' /></p>
<p>Cuando trabajamos con <a href="http://es.wikipedia.org/wiki/ASP.NET" target="_blank" title="ASP.NET">ASP.NET</a> lo mas normal es que nuestra aplicaci&oacute;n este dividida en mas de un WebForm.<br />
Esto conlleva que en m&aacute;s de una ocasi&oacute;n necesitaremos ir de una p&aacute;gina a otra, y para realizar esa &quot;navegaci&oacute;n&quot;, tenemos opciones claramente diferenciadas:</p>
<p><code>Server.Transfer():</code> +1 Sobrecargas<br />
<br />
Finaliza la ejecuci&oacute;n de la p&aacute;gina actual y comienza la ejecuci&oacute;n de una nueva p&aacute;gina para la solicitud actual.<br />
<br />
<code>Response.Redirect():</code> +1 Sobrecargas<br />
<br />
Redirecciona un cliente a una nueva direcci&oacute;n <abbr lang="en" title="Uniform Resource Locator">URL</abbr>. Especifica la nueva <abbr lang="en" title="Uniform Resource Locator">URL</abbr> y si la ejecuci&oacute;n de la p&aacute;gina actual debe finalizar.<br />
<br />
<code>Server.Execute():</code> +1 Sobrecargas<br />
<br />
Ejecuta la solicitud actual utilizando otra p&aacute;gina ubicada en la ruta de acceso a la direcci&oacute;n <abbr lang="en" title="Uniform Resource Locator">URL</abbr> especificada.<br />
<br />
Los comportamientos de estas tres opciones pueden parecer similares a priori, pero si nos sumergimos un poco m&aacute;s en su funcionamiento veremos en que contexto debe usarse cada una.</p>
<p></p>
<h4>Server.Transfer()</h4>
<p>
Al ejecutar este m&eacute;todo se abandonar&aacute; la p&aacute;gina actual y se navegar&aacute; a la introducida en el par&aacute;metro. Al realizarse esta operaci&oacute;n, no se mostrar&aacute; la <abbr lang="en" title="Uniform Resource Locator">URL</abbr> de la nueva pagina, si no que se mantendr&aacute; la actual. Lo que &quot;ocultara&quot; de cara al usuario la ubicaci&oacute;n de la p&aacute;gina en la que se encuentra. </p>
<p>Su caracter&iacute;stica mas destacada, es que si utilizamos su sobrecarga podemos decirle si va a mandar el conjunto de controles que tenemos en la principal.</p>
<p>
<code><br />
Server.Transfer(&quot;pagina2.aspx&quot;,true)<br />
</code><br />
<br />
Si por ejemplo ten&iacute;amos un formulario con un <code>TextBox</code> en la p&aacute;gina principal, ahora podemos acceder al texto que conten&iacute;a cuando se hizo la navegaci&oacute;n. Para ello utilizaremos el nombre o el &iacute;ndice del control (hay que tener en cuenta, que si el control no existe, al intentar obtenerlo devolver&aacute; una excepci&oacute;n.):<br />
<br />\r\n<br />
<br />
<code><br />
string cadena = Request.Form[&quot;NombreControl&quot;];<br />
</code><br />
<br />
<code><br />
string cadena = Request.Form[indice];<br />
</code><br />
<br />
Otra de las peculiaridades de este m&eacute;todo, es que como la redirecci&oacute;n conlleva enviar objetos de servidor, no permite redirigir a <abbr lang="en" title="Uniform Resource Locator">URL</abbr>\&#8217;s ajenas a la aplicaci&oacute;n (como a <a href="http://www.google.es" target="_blank" title="Google">Google</a> o suced&aacute;neos) ni a <abbr lang="en" title="Uniform Resource Locator">URL</abbr>&#8217;s de <abbr lang="en" title="Hyper Text Markup Language">HTML</abbr> plano incluso si est&aacute;n incluidas dentro de la aplicaci&oacute;n. Por tanto si fuera necesario, deber&iacute;amos crear un WebForm.aspx est&aacute;ndar e incluir dentro el <abbr lang="en" title="Hyper Text Markup Language">HTML</abbr> que necesitemos. </p>
<h4>Response.Redirect()</h4>
<p>
Al ejecutar este m&eacute;todo se abandonar&aacute; la p&aacute;gina actual y se navegar&aacute; a la p&aacute;gina introducida por par&aacute;metro, permitiendo adem&aacute;s la posibilidad de que se mantenga la ejecuci&oacute;n de esa p&aacute;gina.</p>
<p>Es decir, ante dos botones con un c&oacute;digo como este:</p>
<p><code><br />
private void btnRedirigir_Click(object sender, System.EventArgs e) {<br />
     Response.Redirect("prueba.aspx",false);<br />
     Session["nombre"] == "Texto";<br />
}</p>
<p>private void btnRedirigir2_Click(object sender, System.EventArgs e){<br />
     Response.Redirect("prueba.aspx");<br />
     Session["nombre"] == "Texto";<br />
}<br />
</code></p>
<p>Al llegar al <code>Page_Load</code> de la p&aacute;gina prueba.aspx, veremos que si hab&iacute;amos pulsado el primer bot&oacute;n, tendremos almacenado en <code>Session[&quot;nombre&quot;]</code> la cadena <code>&quot;Texto&quot;</code>, mientras que si se utiliz&oacute; el segundo bot&oacute;n ese objeto de sesi&oacute;n no existe.</p>
<p>Adem&aacute;s de esto, se puede utilizar la redirecci&oacute;n utilizando las variables por <abbr lang="en" title="Uniform Resource Locator">URL</abbr> (como las <code>$_GET</code> de <abbr lang="en" title="PHP: Hypertext Preprocessor">PHP</abbr>). Es tan simple como crear la <code>string</code> con esas variables ya incluidas.</p>
<p><code><br />
string querystring = "prueba.aspx?p=" + variable1.ToString() + "&#038;q=" + variable2.ToString();<br />
Response.Redirect(querystring);<br />
</code><br />
<br />
Estas se almacenan en la <code>Request</code> y se puede acceder a ellas f&aacute;cilmente: </p>
<p><code><br />
int valor1 = Convert.toInt32(Request.Params["p"]);<br />
int valor2 = Convert.toInt32(Request.Params["q"]);<br />
</code></p>
<p>Al igual que cuando se almacenan objetos en sesi&oacute;n, hay que realizar un casting ya que todo se guarda como <code>object</code>.</p>
<p>Al contrario que el <code>Server.Transfer</code>, este m&eacute;todo si permite redirigir a una p&aacute;gina externa (como un hiperv&iacute;nculo) y si que se ve la <abbr lang="en" title="Uniform Resource Locator">URL</abbr> de la p&aacute;gina al cargarse.        </p>
<h4>Server.Execute()</h4>
<p>
Esta es la opci&oacute;n menos recomendada, ya que no redirige f&iacute;sicamente, si no que ejecuta el c&oacute;digo de la segunda pagina dentro de la primera. Su uso m&aacute;s habitual se basa en insertar un control de tipo <code>Literal</code> en la p&aacute;gina principal, y ejecutar una segunda p&aacute;gina a trav&eacute;s de un <code>StringWriter</code> (que requiere un a&ntilde;adir un <code>using</code> del namespace <code>System.IO</code>), y que el resultado se almacene en el <code>Literal</code>. Por ejemplo:</p>
<p>StringWriter sw = new StringWriter();<br />
Server.Execute(&#8220;prueba.aspx&#8221;,sw);<br />
this.Literal1.Text = sw.ToString();     </p>
<p>
Si en prueba.aspx almacenamos el c&oacute;digo de un <code>Input TextBox</code> y un <code>Input Button</code> dentro de un <code>Panel</code>, al ejecutar ese m&eacute;todo obtendremos ese mismo conjunto de controles sin tener que ir f&iacute;sicamente a la p&aacute;gina.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dubasdey.com/2007/06/18/aspnet-y-la-navegacin-entre-pginas/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

