Share via


Envío entre páginas en las páginas Web ASP.NET

Actualización: noviembre 2007

De forma predeterminada, los botones y otros controles que producen una devolución de datos en una página Web ASP.NET vuelven a enviar la página a ella misma. Esto forma parte del ciclo de ida y vuelta que recorren las páginas Web ASP.NET como parte de su procesamiento normal. Para obtener información detallada, vea Introducción a páginas Web de ASP.NET.

En determinadas circunstancias, podría verse en la necesidad de enviar una página a otra página. Por ejemplo, podría crear un formulario con varias páginas que obtiene información diferente en cada página. En ese caso, puede configurar ciertos controles (aquellos que implementan la interfaz IButtonControl, como el control Button) en la página para enviarla a otra página de destino diferente. Esto se denomina envío entre páginas. El envío entre páginas proporciona algunas ventajas sobre el uso del método Transfer para redirigir a otra página. Para obtener información detallada, vea Redirigir a los usuarios a otra página.

Nota:

También puede utilizar el control Wizard para crear formularios con varias vistas. Para obtener información detallada, vea Información general sobre Wizard (Control de servidor Web).

Dado que el envío entre páginas se configura para cada control, puede crear una página que realice envíos a páginas diferentes según el botón en el que haga clic el usuario.

Obtener información de la página de origen

Cuando se configura una página para el envío entre páginas, a menudo se desea obtener información de la página de origen. Esto podría incluir la información de los controles de la página, es decir, la información que envía el explorador, así como las propiedades públicas de la página de origen.

Obtener los valores de los controles

La clase Page expone una propiedad denominada PreviousPage. Si la página de origen y la de destino se encuentran en la misma aplicación ASP.NET, la propiedad PreviousPage de la página de destino contiene una referencia a la página de origen. (Si la página no es el destino de un envío entre páginas o las páginas están en aplicaciones diferentes, la propiedad PreviousPage no se inicializa.) De forma predeterminada, la propiedad PreviousPage es de tipo Page.

Nota:

Si la página de origen y la de destino están en aplicaciones diferentes, no puede obtener directamente los valores de los controles de la página, pero sí puede leer los datos devueltos del diccionario Form. No es posible leer el estado de vista de la página de origen, dado que se le ha aplicado un algoritmo hash. Si desea almacenar valores en la página de origen y hacer que estén disponibles en una página de origen de otra aplicación, puede almacenar los valores como cadenas dentro de campos ocultos en la página de origen y tener acceso a ellos a través de Request.Form en la página de destino.

Si utiliza la referencia de la propiedad PreviousPage, puede buscar controles en la página de origen y extraer sus valores. Normalmente, esto se consigue mediante el método FindControl.

Nota:

Si está escribiendo el código de la página de origen específicamente para poder compartir información con las páginas de destino, una forma más fácil de poner los valores de los controles a disposición de la página de destino consiste en exponerlos como propiedades públicas. Para obtener información detallada, vea Obtener los valores de las propiedades públicas de la página de origen más adelante en este tema.

En el ejemplo de código siguiente se muestra cómo obtener el valor del control TextBox1 de la página de origen.

If Not Page.PreviousPage Is Nothing Then
    Dim SourceTextBox As TextBox
    SourceTextBox = CType(PreviousPage.FindControl("TextBox1"), _
        TextBox)
    If Not SourceTextBox Is Nothing Then
        Label1.Text = SourceTextBox.Text
    End If
End If
if (Page.PreviousPage != null)
{
    TextBox SourceTextBox = 
        (TextBox)Page.PreviousPage.FindControl("TextBox1");
    if (SourceTextBox != null)
    {
        Label1.Text = SourceTextBox.Text;
    }
}

El método FindControl busca controles en el contenedor de nombres actual. Si el control que está buscando está dentro de otro control (generalmente, dentro de una plantilla), primero debe obtener una referencia al contenedor y, a continuación, buscar en éste para localizar el control que desea obtener. En el ejemplo de código siguiente, la página de origen contiene un control Login con un contenedor LayoutTemplate que, a su vez, contiene un control TextBox denominado UserName. El código obtiene el valor del control UserName.

Dim LoginControl As Login
LoginControl = CType(PreviousPage.FindControl("Login1"), Login)
If Not LoginControl Is Nothing Then
    Dim UserName As TextBox
    UserName = CType(LoginControl.FindControl("UserName"), TextBox)
    If Not UserName Is Nothing Then
        Label1.Text = UserName.Text
    End If
Else
    Label1.Text = "Cannot find user name in Login control."
End If
Login LoginControl = (Login)PreviousPage.FindControl("Login1");
if (LoginControl != null)
{
    TextBox UserName = (TextBox)LoginControl.FindControl("UserName");
    if (UserName != null)
    {
        Label1.Text = UserName.Text;
    }
}
else
{
    Label1.Text = "Cannot find user name in Login control.";
}

Obtener los valores de las propiedades públicas de la página de origen

En la página de destino de un envío entre páginas, también es posible obtener los valores de los miembros públicos de la página de origen. El escenario más común es aquél en el que la página de origen define las propiedades públicas y se desea obtener sus valores en la página de destino.

Nota de seguridad:

Se recomienda exponer sólo la información necesaria como propiedades públicas para reducir la cantidad de información disponible para usuarios potencialmente malintencionados.

Para obtener los miembros públicos de la página de origen, primero debe obtener una referencia con establecimiento inflexible de tipos a la página de origen.

Esto puede hacerse de varias maneras. La primera consiste en incluir una directiva @ PreviousPageType en la página de destino, que le permite especificar la página de origen, como en este ejemplo:

<%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %> 

Cuando se incluye esta directiva, la propiedad PreviousPage tiene establecimiento inflexible de tipos para la clase de la página de origen a la que se ha hecho referencia. En consecuencia, es posible hacer referencia directamente a los miembros públicos de la página de origen. Puede especificar el tipo de esta página directamente mediante un atributo type o indirectamente haciendo referencia de forma explícita a dicha página en un atributo VirtualPath, como se muestra en el ejemplo.

En el ejemplo de código siguiente se muestra una parte de una página de origen que contiene una propiedad pública denominada CurrentCity que expone el valor de un control TextBox denominado textCity.

Public ReadOnly Property CurrentCity() As String
    Get
        Return textCity.Text
    End Get
End Property
public String CurrentCity
{
    get
    {
        return textCity.Text;
    }
}
Nota:

Las propiedades de la página de origen que se crean principalmente para exponer valores y ponerlos a disposición de otras páginas suelen ser propiedades de sólo lectura. Aunque la página de origen puede contener propiedades de lectura y escritura públicas, generalmente no tiene sentido establecer una propiedad de la página de origen desde la propiedad de la página de destino, ya que no se conservará el valor.

Si la página de destino contiene una directiva PreviousPageType que señala a la página de origen, puede tener acceso a la propiedad CurrentCity de la página de origen mediante código como el siguiente.

Label1.Text = PreviousPage.CurrentCity;
Label1.Text = PreviousPage.CurrentCity;

Otra manera de obtener una referencia con establecimiento inflexible de tipos a la página de origen consiste en incluir una directiva @ Reference en la página de destino que haga referencia a la página de origen, como haría con cualquier tipo que deseara utilizar en una página. En ese caso, en la página de destino puede obtener la propiedad PreviousPage de dicha página y convertirla al tipo de la página de origen, como en el ejemplo de código siguiente.

Dim sourcePage As SourcePage_aspx
sourcePage = CType(PreviousPage, SourcePage_aspx)
Label1.Text = p.CurrentCity
SourcePage_aspx sourcePage;
sourcePage = (SourcePage_aspx) PreviousPage;
Label1.Text = sourcePage.CurrentCity;

Comprobar las devoluciones de datos en la página de destino

Durante una devolución de datos entre páginas, el contenido de los controles de la página de origen se envía a la página de destino y el explorador ejecuta una operación HTTP POST (no una operación GET). Sin embargo, en la página de destino, la propiedad IsPostBack es false inmediatamente después de un envío entre páginas. Aunque su comportamiento es el de un método POST, el envío entre páginas no es una devolución de datos a la página de destino. Por consiguiente, la propiedad IsPostBack se establece en false y la página de destino puede recorrer su nuevo código.

Si resulta útil en su aplicación, puede determinar si la página de destino se está ejecutando como resultado de un envío entre páginas. Para ello, puede probar la propiedad IsCrossPagePostBack de la referencia de página devuelta por la propiedad PreviousPage de la página de destino, como en el ejemplo de código siguiente.

If PreviousPage IsNot Nothing Then
    If PreviousPage.IsCrossPagePostBack = True Then
         Label1.Text = "Cross-page post."
    End If
Else
    Label1.Text = "Not a cross-page post."
End If
if(PreviousPage != null)
{
    if(PreviousPage.IsCrossPagePostBack == true)
    {
         Label1.Text = "Cross-page post.";
    }
}
else
{
    Label1.Text = "Not a cross-page post.";
}

Tenga en cuenta que si la página actual no es el destino de un envío entre páginas, la propiedad PreviousPage devuelve null (Nothing en Visual Basic).

Para obtener más información, vea Cómo: Determinar el modo en que se invocaron las páginas Web ASP.NET.

El envío entre páginas y Server.Transfer

La propiedad PreviousPage y la directiva PreviousPageType son útiles en dos situaciones en las que se invoca la página de destino: en una devolución de datos entre páginas, que es una transferencia basada en el cliente y en la ejecución del método Transfer, que es una operación basada en el servidor. En ambas operaciones, el código de la página de destino puede obtener una referencia a la página de origen mediante la propiedad PreviousPage.

En ciertas situaciones, es posible que sea importante determinar en la página de destino si se ha invocado la página desde un envío entre páginas o desde una operación Server.Transfer. Para ayudarle a realizar esta operación, la clase Page expone una propiedad denominada IsCrossPagePostBack. Para obtener información detallada, vea Cómo: Determinar el modo en que se invocaron las páginas Web ASP.NET.

Vea también

Tareas

Cómo: Enviar páginas Web ASP.NET a una página diferente

Cómo: Determinar el modo en que se invocaron las páginas Web ASP.NET