Existen diferentes formas de pasar datos entre formas en la web. Sabemos que
el protocolo http no guarda el estado (
stateless), asi que los datso
deben ser guardados en alguna parte. A diferencia del ASP tradicional en ASP.NET
existen diferentes vias para hacerlo:
- Query String.
- Cookies.
- Variables de sesión.
- Cross Page Posting.
- Submit Form.
- Server.Transfer o Server.Execute.
1.-
QueryStrings: Para pasar el contenido de
TextBox1.Text de
WebForm1 a
Webform2 en el evento
click de Button1.
Para enviarlo:
protected void Button1_Click(object sender,
EventArgs e)
{
Response.Redirect("WebForm2.aspx?id=" + TextBox1.Text);
}
Para recibirlo:
string queryStringID =
Request.QueryString["id"];
2.- Cookies
Para guardar el valor de
TextBox1.Text en una cookie:
protected void Button1_Click(object sender, EventArgs
e)
{
HttpCookie
cookie = new HttpCookie("UserName");
cookie.Value = TextBox1.Text;
cookie.Expires =
DateTime.Now.AddDays(1);
Response.Cookies.Add(cookie);
Response.Redirect("WebForm2.aspx");
}
Para leerla:
if(Request.Cookies["UserName"] != null)
Response.Write(Request.Cookies["UserName"].Value);3.- Variables de Sesión:
Para poner el
valor del TextBox1.Text en una variable de sesión:
protected void Button1_Click(object sender, EventArgs
e)
{
Session["UserName"] = TextBox1.Text;
Response.Redirect("WebForm2.aspx");
}Para
leerla:
Response.Write(Session["UserName"]);
4.- Cross Page
Posting:
Poner en la propiedad PostBackUrl del Button1 la dirección de la
segunda página:
Y en la segunda página podemos obtener el valor de la siguiente
manera:
TextBox txtFirstPage =
(TextBox)(PreviousPage.FindControl("TextBox1"));
Response.Write(String.Format("You
wrote {0} in Page1",txtFirstPage.Text));
5.- Submit
Form.
Esto funciona con controles HTML que no sean del lado del
servidor.
Ejemplo de la primera página:
<form id="Form1" method="post"
runat="server">
<asp:TextBox ID="TextBox1"
runat="server"></asp:TextBox>
</form>
<form
name="SubmittedForm" action="WebForm2.aspx"
method="post">
<input id="Submit1" type="submit" value="submit"
onclick="CopyTextToHiddenField()" />
<input name="Hidden1"
type="hidden" />
</form>
La función CopyTextToHiddenField() copia el valor de la caja de texto a un campo escondido. Hay que
ponerla dentro del tag <head> como en el siguiente
ejemplo:
<script
language="javascript">
function
CopyTextToHiddenField()
{
var textbox1Value =
document.getElementById("<%=TextBox1.ClientID%>").value;
document.forms[1].document.getElementById("Hidden1").value =
textbox1Value;
}
</script>
Ahora podemos obtener
el valor de la siguiente manera:
Response.Write(Request.Form["Hidden1"]);
6.- Server.Transfer o
Server.Execute:
En la página que
tenemos nuestra forma debemos usar el Server.Transfer o Server
Execute:
protected void Button1_Click1(object sender, EventArgs
e)
{
Server.Transfer("WebForm2.aspx", true);
}
En la página en que queremos obtener los
datos:
Response.Write(Request.Form["TextBox1"]);
Estas son las formas
que el sitio de Microsoft nos dice que podemos usar, pero hay una forma que a mi
parecer es la mejor de las que he mostrado anteriormente (aunque no sea la
ideal en todos los casos) y es la
siguiente:
En la página inicial colocamos nuestros controles y los exponemos como
propiedades:
public partial class _Default :
System.Web.UI.Page
{
public TextBox pp_Nombre
{
get { return
TextBox1; }
}
public TextBox
pp_Telefono
{
get { return TextBox2;
}
}
protected
void Page_Load(object sender, EventArgs e)
{
}
}
Y en la segunda página colocamos la siguiente directiva:
<%@
PreviousPageType
VirtualPath="~/Default.aspx"
%>
Después colocamos el
siguiente código para leer los
datos:
public partial class Default2 :
System.Web.UI.Page
{
protected void
Page_Load(object sender, EventArgs e)
{
Label1.Text =
PreviousPage.pp_Nombre.Text; Label2.Text =
PreviousPage.pp_Telefono.Text;
}
}
Como pueden ver en .NET existen varias formas de hacerlo y podemos
escoger el que más se ajuste a nuestras
necesidades.
NOTA:
Si estás usando Master Pages puedes usar Cross Page Posting, pero
al buscar el control debes obtener primero una referencia al ContentPlaceHolder
ya que es el contenedor de los controles de tu página
aspx.
Ejemplo:
En la primera página pones en el control que vaya a llamar a la
otra página el nombre de esta en la propiedad
PostBackUrl.
y en la segunda accedes a los controles de la siguiente
manera:
protected void Page_Load(object sender,
EventArgs e)
{
if (Page.PreviousPage != null)
{
ContentPlaceHolder cph = (ContentPlaceHolder)Page.PreviousPage.Master.FindControl("LessonsLearnedPlaceHolder");
if (cph != null)
{
TextBox Sourcelbl = (TextBox)cph.FindControl("txtfailureid");
Component cmp = new Component();
if (Sourcelbl != null)
{
this.LblFailureid.Text = Sourcelbl.Text;
cmp.FailureID =
LblFailureid.Text;
}
}
}
}
Y con esto tendremos acceso a las propiedades de
todos los controles de la página
previa.