Existen varias formas de pasar variables entre formularios web, como por ejemplo haciendo uso de la URL, o usando sesiones. Cada una de estas caracteristicas tiene sus ventajaa y desventajas.
Ahora que nueva característica trajo ASP.NET 2.0?, Cross Page Postback. Pero que hace esta característica, veamos el siguiente gráfico y después damos una breve explicación [URL01]:
Antes con ASP.NET 1.X, solo se podía hacer PostBack a la misma página, es decir cuando pulsaba cualquier botón esta se dirigía hacia si misma, ahora en ASP.NET 2.0, se puede hacer Cross Page Postback, es decir ya no limitar que mi página solo pueda ser enviada a si misma, sino que puedo enviar el contenido a cualquier otra página. Las aplicaciones que se le puede dar a esta característica son varias, veamos algunas de sus ventajas:
- Todo la información de la página actual estará disponible en la página destino.
- Permite que la página destino acceda a las propiedades públicas de la página origen.
- Debido a las ventajas anteriores, permite el paso de variables entre páginas.
Pero manos a la obra, como hacemos esto?, pues aquí uno de los escenarios en los cuáles se podría aplicar. Se trata de un formulario de confirmación de registro, para esto necesitamos el nombre, y los datos ingresados en la página origen, para asi mostrarla en la página destino:
Página Origen (wf_registro.aspx):
Página Destino (wf_confirmacion.aspx):
Ahora cuáles son los pasos para lograr esto?:
- En la página wf_registro.aspx y en el botón de envio btnEnviar, modificamos la siguiente propiedad PostBackUrl (en la ventana de propiedades o desde la vista source de la página):
PostBackUrl="~/wf_confirmacion.aspx"
="~/wf_confirmacion.aspx"
- Ahora en el evento Load de la página wf_confirmacion.aspx, agregamos el siguiente código [Cod01]:
protected void Page_Load(object sender, EventArgs e)
{
string nombre;
TextBox txtNombre =
(TextBox)Page.PreviousPage.FindControl("txtNombre");
nombre = txtNombre.Text;
lblConfirmacion.Text =
string.Format("{0} gracias por ingresar su informacion <br/>" +
"USTED HA SIDO REGISTRADO", nombre);
}
protected void Page_Load(object sender, EventArgs e)
{
string nombre;
TextBox txtNombre =
(TextBox)Page.PreviousPage.FindControl("txtNombre");
nombre = txtNombre.Text;
lblConfirmacion.Text =
string.Format("{0} gracias por ingresar su informacion <br/>" +
"USTED HA SIDO REGISTRADO", nombre);
}
- Corremos y todo OK, pero creen que ahí queda todo? , pues esta funcionando, pero hay que agregar algunas validaciones.
- Qué pasaría si accedemos directamente a wf_confirmacion.aspx, pues que daría un error, para evitar esto agregamos nuestro [Cod01], el que esta dentro del load, y lo ponemos dentro de este if:
if (Page.PreviousPage != null)
{ … }
if (Page.PreviousPage != null)
{ … }
Ahora como podemos mejorar el acceso a la página origen?, si bien el método FindControl es útil, puede no darte precisión al colocar mal el nombre. Para evitar estos incovenientes podemos hacer uso de Propiedades Públicas. Nota: Tratar de colocar solo la información necesaria en variables públicas, para reducir la cantidad de información disponible para usuarios potencialmente malintencionados .
- Para poder acceder a las propiedades de la página origen se debe establecer una referencia "strongly type" a ella. Hay dos formas de hacerlo [URL04], pero nosotros vamos a hacer uso de la directiva @PreviousPageType, para nuestro cometido, y agregamos el siguiente código a nuestra página wf_confirmacion.aspx:
<%@ PreviousPageType VirtualPath="~/wf_registro.aspx" %>
@ PreviousPageType VirtualPath="~/wf_registro.aspx" %>
- Agregamos la siguiente propiedad a nuestra clase wf_registro.aspx.cs:
public string NombreRegistro {
get {
return txtNombre.Text;
}
}
public string NombreRegistro {
get {
return txtNombre.Text;
}
}
- Ahora el nuevo Load de la página wf_confirmacion.aspx, quedaría así:
protected void Page_Load(object sender, EventArgs e)
{
if (Page.PreviousPage != null)
{
string nombre =
PreviousPage.NombreRegistro;
lblConfirmacion.Text =
string.Format("{0} gracias por registrarse <br/>" +
"USTED HA SIDO REGISTRADO", nombre);
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (Page.PreviousPage != null)
{
string nombre =
PreviousPage.NombreRegistro;
lblConfirmacion.Text =
string.Format("{0} gracias por registrarse <br/>" +
"USTED HA SIDO REGISTRADO", nombre);
}
}
- Se nota la diferencia .
Ahora qué sucede si es que yo voy a llamar al página de confirmación de diversas páginas?, es decir no quiero atar la propiedad pública a una página. Pues para eso haremos uso del patrón adapter [URL03]:
- Agregaremos esta interface a la carpeta App_Code:
using System;
public interface IRegistroForm
{
string NombreRegistro
{ get; }
}
System;
public interface IRegistroForm
{
string NombreRegistro
{ get; }
}
- Ahora hacemos que nuestra clase wf_Registro implemente a IRegistreForm, además de heredar de System.Web.UI.Page:
wf_registro : System.Web.UI.Page, IRegistroForm
: System.Web.UI.Page, IRegistroForm
- Ahora podemos remover la directiva @PreviousPageType, de la página wf_confirmacion.aspx, y actualizamos el código dentro de nuestro Load:
protected void Page_Load(object sender, EventArgs e)
{
if (Page.PreviousPage != null)
{
IRegistroForm form = PreviousPage as IRegistroForm;
if (form != null)
{
string nombre =
form.NombreRegistro;
lblConfirmacion.Text =
string.Format("{0} gracias por registrarse <br/>" +
"USTED HA SIDO REGISTRADO", nombre);
}
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (Page.PreviousPage != null)
{
IRegistroForm form = PreviousPage as IRegistroForm;
if (form != null)
{
string nombre =
form.NombreRegistro;
lblConfirmacion.Text =
string.Format("{0} gracias por registrarse <br/>" +
"USTED HA SIDO REGISTRADO", nombre);
}
}
}
Espero que haya quedado claro el post/artículo, si tienen alguna pregunta, o algo que agregar, me dejan un comentario. En nuestro último código deberíamos hacer uso de la propiedad PreviousPage.IsCrossPagePostBack y de PreviousPage.IsValid, para una mejor validación, en las referencias de abajo podremos encontrar más detalles sobre estas propiedad, queda como tarea .
P.D.: Adjunto el archivo del post/artículo.
Referencias:
- [URL01]: Secretos internos de ASP.NET – <link>
- [URL02]: Redirigir a los usuarios a otra página – <link>
- [URL03]: Design Considerations for Cross Page Post Backs in ASP.NET 2.0 – <link>
- [URL04]: Envío entre páginas en las páginas Web ASP.NET – <link>
Saludos,
Post cruzado desde starrillo blog