Cuando desarrollamos un proyecto web y empezamos a agregar páginas y se da el caso que necesitamos enviar datos de una pagina otra pagina nos encontramos un problema o se suele hacer la pregunta ¿Como paso estos datos a otra pagina?.
Bien, hay varias formas de consumir o enviar datos a otras paginas, esto se debe al modelo de postback que contempla ASP.NET. Aquellos programadores que conocen ASP, pudieron utilizar el control granular sobre el elemento form, resumiendo, se podía decir a donde el form debería enviar su contenido, así como el método a utilizar (POST/GET) y el número de los elementos form en una página.
En ASP.NET el metodo prederteminado de envio es POST, y que un valor escogido en la page1, sea visto en la page2.
Para el siguiente ejemplos he creado un proyecto con dos paginas «Default.aspx» (Pagina que enviará la información) y «Recepcion.aspx».
default.aspx
<%
@ Page Language=»VB»AutoEventWireup=»true» CodeFile=»Default.aspx.vb» Inherits=»_Default» %><!
DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.1//EN» «http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd»><
html xmlns=»http://www.w3.org/1999/xhtml»><head runat=»server»>
<title>Untitled Page</title>
</
head><
body><form id=»form1″ runat=»server»>
<asp:ScriptManager ID=»ScriptManager1″ runat=»server» />
<div>
<asp:TextBox ID=»TextBox1″ runat=»server»></asp:TextBox>
<asp:Button ID=»Button1″ runat=»server» Text=»Enviar» />
</div>
</form>
</
body></
html>En Default.aspx tendremos dos objeto, uno de tipo textbox y otro de tipo Button.
<%
@ Page Language=»VB» AutoEventWireup=»false» CodeFile=»Recepcion.aspx.vb» Inherits=»Recepcion» %><!
DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Transitional//EN» «http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd»><
html xmlns=»http://www.w3.org/1999/xhtml» ><
head runat=»server»><title>Pagina sin t¡tulo</title>
</
head><
body><form id=»form1″ runat=»server»>
<div>
<asp:Label ID=»Label1″ runat=»server» Text=»»></asp:Label>
</div>
</form>
</
body></
html>En la página de recepción tendremos un solo objeto de tipo Label.
Puesto que ASP.NET nos permite almacenar elementos en el estado de la sesión actual del proceso, recordemos que HTTP es un protocolo sin estado y que por defecto el servidor no almacena las variables que definamos dentro de cada página o cualquier clase, pero si almacenamos valores dentro de una variable Session, está estará disponible para todas nuestras páginas durante el tiempo que dure la sesión actual (Hasta que cerremos el Browser), este es el método más utilizado.
Utilizando Cross Page
Esta es una nueva característica de ASP.NET 2.0 que nos permite especificar el destino del postback de la página de una manera muy sencilla, para así poder después consumirla.
A continuación se muestra el código asp de la página Default.aspx el código que se ha añadido al objeto Button.
<%@ Page Language=»VB» AutoEventWireup=»true» CodeFile=»Default.aspx.vb» Inherits=»_Default» %>
<!
DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.1//EN» «http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd»><
html xmlns=»http://www.w3.org/1999/xhtml»><
head runat=»server»> <title>Untitled Page</title></
head><
body> <form id=»form1″ runat=»server»> <asp:ScriptManager ID=»ScriptManager1″ runat=»server» /> <div> <asp:TextBox ID=»TextBox1″ runat=»server»></asp:TextBox> <asp:Button ID=»Button1″ runat=»server» Text=»Enviar» PostBackUrl=»~/Recepcion.aspx» /> </div> </form></
body></
html>
Para que la pagina «Recepcion.aspx» reciba o consuma la información pasa por «Default.aspx» se añade el siguiente código:
Partial
Class Recepcion Inherits System.Web.UI.PageProtected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Page.PreviousPage.IsCrossPagePostBack Then
Dim Txtbox As TextBox = CType(Page.PreviousPage.FindControl(«TextBox1»), TextBox) If Txtbox IsNot Nothing Then Me.Label1.Text = Txtbox.Text End If End IfEnd Sub
End Class
Lo que hace este código es buscar un control cuyo ID es «TextBox1» en la página anterior gracias al método FindControl, pero tras a ver
comprobado antes que con la propiedad IsCrossPagePostBack es True y así consumir la información que contiene.
Para agregar la propiedad IsCrossPagePostBack hay que agregar la directiva siguiente:
<%
@ PreviousPageType VirtualPath=»~/Default.aspx» %>
a la página de recepción o destino.
Con está directiva también se puede hacer una propiedad pública en la página de origen (default.aspx).
Partial
Class _Default Inherits System.Web.UI.PagePublic ReadOnly Property Envio() As String Get If Me.TextBox1.Text.Length > 0 Then Return Me.TextBox1.Text Else Return Nothing End If End Get End Property
End
Class
Y en la pagina de «Recepcion» ponemos este otro código:
Partial
Class Recepcion Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Page.PreviousPage.IsCrossPagePostBack Then ‘Dim Txtbox As TextBox = CType(Page.PreviousPage.FindControl(«TextBox1»), TextBox) ‘If Txtbox IsNot Nothing Then ‘ Me.Label1.Text = Txtbox.Text ‘End If Me.Label1.Text = Me.PreviousPage.Envio() End If End SubEnd
Class
Os preguntareis como puede ser esto posible, la respuesta está en que cuando especificamos que un control va a tener un destino
Postbackurl, estamos añadiendo un nuevo campo oculto dentro de la página, el cual va a almacenar información sobre la misma
para poder ser accedida por la página de destino a traves de su propiedad PreviosPage, la cual tiene una propiedad
IsCrossPagePostBack que nos va a indicar si se genero el Cross Post Back o no.
De esta forma podemos optimizar el traspaso de informacion entre paginas, siempre y cuando el escenario lo permita conveniente
Saludos.