Compartir a través de


Pasar valores de control de servidor entre páginas

Al crear una aplicación Web Forms, a menudo es necesario pasar información de una página de formularios Web Forms a otra. Gracias a ello se puede escribir la información en una página de formularios Web Forms y, después, enviarla a otra página para su procesamiento.

El modelo de diseño para pasar valores entre páginas de formularios Web Forms mediante código en línea es algo diferente del modelo para archivos de código en segundo plano. La elección de un determinado modelo de diseño está en función de si se prefiere utilizar código en línea o archivos de código en segundo plano. En las siguientes secciones se describen ambos modelos.

Modelo de diseño mediante código en línea

Cuando pase valores a otra página de formularios Web Forms mediante código en línea, primero debe especificar un nombre de clase para la página de formularios Web Forms que contiene la información que desea enviar. Para especificar un nombre de clase para la página de formularios Web Forms, incluya el atributo ClassName, junto con el nombre de la clase, en la directiva @Page. A continuación, cree una propiedad con un descriptor de acceso get en la clase para cada valor que desee compartir. El descriptor de acceso get debe devolver el valor que desea pasar, por ejemplo el valor de un cuadro de texto. Para enviar la información, transfiera el control de la aplicación a otra página de formularios Web Forms mediante el método Transfer del objeto Server.

En la página de formularios Web Forms receptora, haga referencia a la clase declarada en la página remitente; para ello, agregue una directiva @Reference al principio de la página y establezca el atributo Page como la página remitente. A continuación, la página de formularios Web Forms receptora puede obtener acceso a la información; para ello, debe recuperar una instancia del controlador que primero recibió la solicitud HTTP de la propiedad Handler del objeto HttpContext. A continuación, el objeto controlador se convierte en una instancia de la clase que encapsula la información transferida. Una vez que se ha realizado la conversión, se puede obtener acceso a los valores transferidos mediante las propiedades del objeto convertido.

Para crear una página de formularios Web Forms que envíe valores a otra página de formularios Web Forms

  1. Especifique un nombre de clase para la página de formularios Web Forms de origen; para ello, agregue una directiva @Page al principio de la página de formularios Web Forms y establezca un nombre de clase válido en el atributo ClassName.

    <%@ Page Language="VB" ClassName="MyClassName" %>
    [C#]
    <%@ Page Language="C#" ClassName="MyClassName" %>
    
  2. Defina una propiedad con un descriptor de acceso get en la clase para cada valor que desee pasar a otra página de formularios Web Forms. El descriptor de acceso get debe devolver el valor que desea pasar, por ejemplo, el valor de un cuadro de texto en la página de formularios Web Forms. Las propiedades deben estar definidas en una secuencia de comandos del servidor.

    <script runat="server">
       Public ReadOnly Property FirstName() As String
          Get
             ' FirstNameTextBox is the name of a TextBox control.
             Return FirstNameTextBox.Text
          End Get
       End Property
    </script>
    [C#]
    <script runat="server">
       public string FirstName
       {
          get
          {
             // FirstNameTextBox is the name of a TextBox control.
             return FirstNameTextBox.Text;
          }
       }
    </script> 
    
  3. Cuando desee pasar la información a otra página de formularios Web Forms (por ejemplo, cuando se hace clic en un botón), utilice el método HttpServerUtility.Transfer para poner fin a la ejecución en la página actual y transferir el control de la aplicación a otra página de formularios Web Forms. El método HttpServerUtility.Transfer acepta un solo parámetro que le permite especificar la dirección URL de la página de formularios Web Forms a la que desea transferir el control.

    Sub SubmitButtonClick(sender As Object, e As EventArgs)
       Server.Transfer("secondpage.aspx")
    End Sub
    
    [C#]
    void SubmitButtonClick(object sender, EventArgs e)
    {
       Server.Transfer("secondpage.aspx");
    }
    

A continuación se incluye un ejemplo completo de cómo crear una página de formularios Web Forms mediante código en línea para los valores de dos controles TextBox a otra página de formularios Web Forms. Este ejemplo debe denominarse Firstpage.aspx.

<%@ Page Language="VB" ClassName="FirstPageClass" %>

<html>
<head>
 
   <script runat="server">
      Public ReadOnly Property FirstName() As String
         Get
            ' first is the name of a TextBox control.
            Return first.Text
         End Get
      End Property

      Public ReadOnly Property LastName() As String
         Get
            ' last is the name of a TextBox control.
            Return last.Text
         End Get
      End Property

      Sub ButtonClicked(sender As Object, e As EventArgs) 
         Server.Transfer("secondpage.aspx") 
      End Sub

   </script> 

</head>

<body>

   <form runat="server">
      First Name: 
      <asp:TextBox id="first" 
           runat="server"/> 
      <br>
      Last Name: 
      <asp:TextBox id="last" 
           runat="server"/>
      <br>
      <asp:Button 
           OnClick="ButtonClicked" 
           Text="Go to second page"
           runat=server />
   </form>

</body>

</html>
[C#]
<%@ Page Language="C#" ClassName="FirstPageClass" %>

<html>
<head>
 
   <script runat="server">

      public string FirstName 
      { 
         get 
         { 
            return first.Text; 
         } 
      }

      public string LastName 
      { 
         get 
         { 
            return last.Text; 
         } 
      }

      void ButtonClicked(object sender, EventArgs e) 
      { 
         Server.Transfer("secondpage.aspx"); 
      }

   </script> 

</head>

<body>

   <form runat="server">
      First Name: 
      <asp:TextBox id="first" 
           runat="server"/> 
      <br>
      Last Name: 
      <asp:TextBox id="last" 
           runat="server"/>
      <br>
      <asp:Button 
           OnClick="ButtonClicked" 
           Text="Go to second page"
           runat=server />
   </form>

</body>

</html>

Para crear una página de formularios Web Forms que reciba valores de otra página de formularios Web Forms

  1. Agregue una directiva @Reference al principio de la página de formularios Web Forms que recibe la información, establezca el atributo Page como la página de formularios Web Forms de origen (la página de formularios Web Forms que contiene la información que desea pasar).

    <%@ Reference Page="firstpage.aspx" %>
    
  2. Declare una variable en una secuencia de comandos del servidor para almacenar una instancia de la clase definida en la página de formularios Web Forms desde la que se envía la información.

    <script runat="server">
       Dim fp As FirstPageClass
    </script>
    [C#]
    <script runat="server">
       FirstPageClass fp;
    </script>
    
  3. Cuando la página de formularios Web Forms no se devuelva datos a sí misma, cree un controlador de eventos Page_Load personalizado que asigne el objeto IHttpHandler implementado para la actual solicitud HTTP a la variable declarada en el paso anterior. Utilice la propiedad IsPostBack para determinar si la página se está devolviendo datos a sí misma. El objeto IHttpHandler implementado contiene una instancia del controlador que primero recibió la solicitud HTTP. Como el objeto IHttpHandler implementado no es el mismo tipo de objeto que la variable declarada en el paso anterior, para poder asignárselo a la variable hay que convertirlo a la clase que encapsula la información enviada desde la primera página de formularios Web Forms. Recupere el objeto controlador mediante la propiedad Handler del objeto HttpContext.

    <script runat="server">
       Sub Page_Load()
          If Not IsPostBack Then
             fp =  CType(Context.Handler, FirstPageClass)
          End If
       End Sub
    </script>
    
    [C#]
    <script runat="server">
       void Page_Load()
       {
          if (!IsPostBack)
          {
             fp = (FirstPageClass)Context.Handler;
          }
       }
    </script>
    
  4. En este momento, la variable declarada en el segundo paso contiene una instancia de la clase que encapsula la información proveniente de la página de formularios Web Forms anterior. Utilice la variable para obtener acceso a las propiedades de la clase que contiene la información enviada desde la página de formularios Web Forms anterior. Puede obtener acceso a estos valores mediante programación para realizar un cálculo o, simplemente, mostrarlos mediante los delimitadores de secuencia de comandos <%= y %>.

    Hello <%=fp.FirstName%>
    

A continuación se incluye un ejemplo completo de una página de formularios Web Forms que recibe dos valores de otra página de formularios Web Forms. Después, los valores se muestran en la página de formularios Web Forms. Este ejemplo debe denominarse Secondpage.aspx.

<%@ Page Language="VB" %>
<%@ Reference Page="firstpage.aspx" %>

<html>

<head>
 
   <script runat="server">

      Dim fp As FirstPageClass

      Sub Page_Load() 
         If Not IsPostBack Then
            fp = CType(Context.Handler, FirstPageClass)
         End If 
      End Sub

   </script>

</head> 

<body>

   <form runat="server">

      Hello <%=fp.FirstName%> <%=fp.LastName%>

   </form>

</body>

</html>

[C#]
<%@ Page Language="C#" %>
<%@ Reference Page="firstpage.aspx" %>

<html>

<head>
 
   <script runat="server">

      FirstPageClass fp;

      void Page_Load()
      {
         if (!IsPostBack)
         {
            fp = (FirstPageClass)Context.Handler;
         }
      }
   
   </script>

</head> 

<body>

   <form runat="server">

      Hello <%=fp.FirstName%> <%=fp.LastName%>

   </form>

</body>
</html>

Modelo de diseño mediante archivos de código en segundo plano

Los archivos de código en segundo plano contienen una declaración de clase para el código asociado con la página de formularios Web Forms. En el archivo de código en segundo plano para la página de formularios Web Forms que envía la información, cree primero una propiedad con un descriptor de acceso get en la clase para cada valor que desee compartir. El descriptor de acceso get debe devolver el valor que desea pasar, por ejemplo el valor de un cuadro de texto. Para enviar la información, transfiera el control de la aplicación a otra página de formularios Web Forms mediante el método Transfer del objeto Server.

En la página de formularios Web Forms receptora, haga referencia a la clase declarada en la página remitente; para ello, agregue una directiva @Reference al principio de la página y establezca el atributo Page como la página remitente. A continuación podrá recuperar una instancia del controlador que primero recibió la solicitud HTTP proveniente de la propiedad Handler del objeto HttpContext.

Nota   Para que la clase declarada en la página de formularios Web Forms remitente esté disponible en el archivo de código en segundo plano de la página de formularios Web Forms receptora, debe compilar manualmente en un solo archivo .dll los archivos de código en segundo plano de cada página de formularios Web Forms; para ello, utilice el compilador de la línea de comandos. El archivo .dll debe quedar colocado en el directorio \Bin de la aplicación Web Forms.

A continuación, el objeto controlador se convierte en una instancia de la clase que encapsula la información transferida. Una vez que se ha realizado la conversión, se puede obtener acceso a los valores transferidos mediante las propiedades del objeto convertido.

Para enviar valores de control de servidor desde otra página de formularios Web Forms

  1. Cree para la página de formularios Web Forms remitente un archivo de código en segundo plano que contenga una declaración de clase para el código asociado con la página.

    Imports System
    ' Add other references here.
    
    Public Class FirstPageClass
       Inherits System.Web.UI.Page
    
       ' Add class code here.
    
    End Class
    [C#]
    Imports System
    // Add other references here.
    
    public class FirstPageClass : System.Web.UI.Page
    {   
       // Add class code here.
    }
    
  2. Para obtener acceso a los controles de servidor de la página de formularios Web Forms en la clase declarada en el archivo de código en segundo plano, declare variables protegidas en la clase para representar los controles de servidor a los que desea tener acceso.

    Protected FirstNameTextBox As System.Web.UI.WebControls.TextBox 
    [C#]
    protected System.Web.UI.WebControls.TextBox FirstNameTextBox;
    
  3. En la clase declarada en el primer paso, defina una propiedad con un descriptor de acceso get para cada valor que desee pasar a otra página de formularios Web Forms. El descriptor de acceso get debe devolver el valor que desea pasar, por ejemplo, el valor de un cuadro de texto en la página de formularios Web Forms.

    Public ReadOnly Property FirstName() As String
       Get
          ' FirstNameTextBox is the name of a TextBox control.
          Return FirstNameTextBox.Text
       End Get
    End Property
    [C#]
    public string FirstName
    {
       get
       {
          // FirstNameTextBox is the name of a TextBox control.
          return FirstNameTextBox.Text;
       }
    }
    
  4. Cuando desee pasar la información a otra página de formularios Web Forms (por ejemplo, cuando se hace clic en un botón), utilice el método HttpServerUtility.Transfer para poner fin a la ejecución en la página actual y transferir el control de la aplicación a otra página de formularios Web Forms. El método HttpServerUtility.Transfer acepta un solo argumento que le permite especificar la dirección URL de la página de formularios Web Forms a la que desea transferir el control.

    Sub SubmitButtonClick(sender As Object, e As EventArgs)
       Server.Transfer("secondpage.aspx")
    End Sub
    
    [C#]
    void SubmitButtonClick(object sender, EventArgs e)
    {
       Server.Transfer("secondpage.aspx");
    }
    
  5. Cree la interfaz para la página de formularios Web Forms que envía la información. Asegúrese de agregar un atributo Inherits a la directiva @Page que esté configurada con la clase declarada en el archivo de código en segundo plano.

    <%@ Page Language="VB" Inherits="FirstPageClass" %>
    
    <html>
    <head>
    
    </head>
    
    <body>
    
       <!-- Add User Interface here -->
    
    </body>
    [C#]
    <%@ Page Language="C#" Inherits="FirstPageClass" %>
    
    <html>
    <head>
    
    </head>
    
    <body>
    
       <!-- Add User Interface here -->
    
    </body>
    

A continuación se incluye un ejemplo completo del archivo de código en segundo plano asociado con la página de formularios Web Forms que envía la información. Dependiendo de si utiliza Visual Basic o C#, asegúrese de que este ejemplo se denomina Firstpage.aspx.vb o Firstpage.aspx.cs, respectivamente.

Imports System

Public Class FirstPageClass :
   Inherits System.Web.UI.Page

   Protected first As System.Web.UI.WebControls.TextBox
   Protected last As System.Web.UI.WebControls.TextBox
   Protected Button1 As System.Web.UI.WebControls.Button

   Public ReadOnly Property FirstName() As String
      Get
         ' first is the name of a TextBox control.
         Return first.Text
      End Get
   End Property

   Public ReadOnly Property LastName() As String
      Get
         ' last is the name of a TextBox control.
         Return last.Text
      End Get
   End Property

   Sub ButtonClicked(sender As Object, e As EventArgs) 
      Server.Transfer("secondpage.aspx") 
   End Sub

End Class
[C#]
using System;

public class FirstPageClass : System.Web.UI.Page
{
   protected System.Web.UI.WebControls.TextBox first;
   protected System.Web.UI.WebControls.TextBox last;
   protected System.Web.UI.WebControls.Button Button1;

   public string FirstName 
   { 
      get 
      { 
         return first.Text; 
      } 
   }

   public string LastName 
   { 
      get 
      { 
         return last.Text; 
      } 
   }

   void ButtonClicked(object sender, EventArgs e) 
   { 
      Server.Transfer("secondpage.aspx"); 
   }

}

A continuación se incluye un ejemplo completo de cómo crear una página de formularios Web Forms mediante un archivo de código en segundo plano para pasar los valores de dos controles TextBox a otra página de formularios Web Forms. Asegúrese de que este ejemplo se denomina Firstpage.aspx.

<%@ Page Language="VB" Inherits="FirstPageClass" %>

<html>
<head>

</head>

<body>

   <form runat="server">
      First Name: 
      <asp:TextBox id="first" 
           runat="server"/> 
      <br>
      Last Name: 
      <asp:TextBox id="last" 
           runat="server"/>
      <br>
      <asp:Button
           id="Button1" 
           OnClick="ButtonClicked" 
           Text="Go to second page"
           runat=server />
   </form>

</body>

</html>

[C#]
<%@ Page Language="C#" Inherits="FirstPageClass" %>

<html>
<head>

</head>

<body>

   <form runat="server">
      First Name: 
      <asp:TextBox id="first" 
           runat="server"/> 
      <br>
      Last Name: 
      <asp:TextBox id="last" 
           runat="server"/>
      <br>
      <asp:Button
           id="Button1" 
           OnClick="ButtonClicked" 
           Text="Go to second page"
           runat=server />
   </form>

</body>

</html>

Para recibir valores de control de servidor desde otra página de formularios Web Forms

  1. Cree para la página de formularios Web Forms receptora un archivo de código en segundo plano que contenga una declaración de clase para el código asociado con la página.

    Imports System
    ' Add other references here.
    
    Public Class SecondPageClass
       Inherits System.Web.UI.Page
    
       ' Add class code here.
    
    End Class
    [C#]
    Imports System
    // Add other references here.
    
    public class SecondPageClass : System.Web.UI.Page
    {   
       // Add class code here.
    }
    
  2. Para obtener acceso a los controles de servidor de la página de formularios Web Forms en el archivo de código en segundo plano, declare variables protegidas en la clase para representar los controles de servidor a los que desea tener acceso.

    Protected FirstNameTextBox As System.Web.UI.WebControls.TextBox 
    [C#]
    protected System.Web.UI.WebControls.TextBox FirstNameTextBox;
    
  3. Declare una variable en la clase para almacenar una instancia de la clase definida en la página de formularios Web Forms que envía la información. Si desea que la variable esté disponible en la página de formularios Web Forms receptora, hágala pública.

    Nota   No puede obtener acceso a clase definida en la página de formularios Web Forms que envía la información hasta que compile en un solo archivo .dll los archivos de código en segundo plano de cada página de formularios Web Forms. El archivo .dll debe quedar colocado en el directorio \Bin de la aplicación Web. Este proceso se describe en otro paso.

    Public fp As FirstPageClass
    [C#]
    public FirstPageClass fp;
    
  4. Cree un controlador de eventos Page_Load personalizado que asigne el objeto IHttpHandler implementado para la actual solicitud HTTP a la variable declarada en el paso anterior (cuando la página de formularios Web Forms no se devuelva datos a sí misma). Utilice la propiedad IsPostBack para determinar si la página se está devolviendo datos a sí misma. El objeto IHttpHandler implementado contiene una instancia del controlador que primero recibió la solicitud HTTP. Como el objeto IHttpHandler implementado no es el mismo tipo de objeto que la variable declarada en el paso anterior, para poder asignárselo a la variable hay que convertirlo a la clase que encapsula la información enviada desde la primera página de formularios Web Forms. Recupere el objeto controlador mediante la propiedad Handler del objeto HttpContext.

    Sub Page_Load()
       If Not IsPostBack Then
          fp =  CType(Context.Handler, FirstPageClass)
       End If
    End Sub
    [C#]
    void Page_Load()
    {
       if (!IsPostBack)
       {
          fp = (FirstPageClass)Context.Handler;
       }
    }
    
  5. Ahora, la variable declarada en el tercer paso contiene una instancia de la clase que encapsula la información proveniente de la página de formularios Web Forms anterior. Utilice la variable para obtener acceso a la información enviada desde la página de formularios Web Forms anterior. Puede obtener acceso a estos valores mediante programación para realizar un cálculo o, simplemente, mostrarlos mediante los delimitadores de secuencia de comandos <%= y %>.

    Hello <%=fp.FirstName%>
    
  6. Cree la interfaz para la página de formularios Web Forms que envía la información. En la directiva @Page, asegúrese de agregar un atributo Inherits que esté configurado con la clase declarada en el archivo de código en segundo plano.

    <%@ Page Language="VB" Inherits="SecondPageClass" %>
    
    <html>
    <head>
    
    </head>
    
    <body>
    
       <!-- Add User Interface here -->
    
    </body>
    [C#]
    <%@ Page Language="C#" Inherits="SecondPageClass" %>
    
    <html>
    <head>
    
    </head>
    
    <body>
    
       <!-- Add User Interface here -->
    
    </body>
    
  7. Agregue una directiva @Reference al principio de la página de formularios Web Forms que recibe la información, establezca el atributo Page como la página de formularios Web Forms de origen (la página de formularios Web Forms que contiene la información que desea pasar).

    <%@ Reference Page="firstpage.aspx" %>
    
  8. En este momento, las páginas de formularios Web Forms remitente y receptora están completas. Sin embargo, para que la aplicación se ejecute correctamente, hay que compilar en un solo archivo .dll los archivos de código en segundo plano de cada página. Este archivo .dll debe quedar colocado en el directorio \Bin de la aplicación Web. Gracias a ello, en la página de formularios Web Forms receptora se puede obtener acceso a la clase declarada en la página de formularios Web Forms remitente. Para compilar los archivos de código en segundo plano, escriba el siguiente comando en la línea de comandos:

    vbc /out:Bin\appname.dll /r:System.dll /r:System.Web.dll /t:library firstpage.aspx.vb secondpage.aspx.vb 
    [C#]
    csc /out:Bin\appname.dll /r:System.dll /r:System.Web.dll /t:library firstpage.aspx.cs secondpage.aspx.cs
    

A continuación se incluye un ejemplo completo del archivo de código en segundo plano asociado con la página de formularios Web Forms que recibe la información. Dependiendo de si utiliza Visual Basic o C#, asegúrese de que este ejemplo se denomina Secondpage.aspx.vb o Secondpage.aspx.cs, respectivamente.

Imports System

Public Class SecondPageClass  
   Inherits System.Web.UI.Page

   Protected DisplayLabel As System.Web.UI.WebControls.Label
   Public fp As FirstPageClass

Sub Page_Load()
   If Not IsPostBack Then
      fp =  CType(Context.Handler, FirstPageClass)
   End If
   End Sub

End Class
[C#]
using System;

public class SecondPageClass : System.Web.UI.Page
{

   protected System.Web.UI.WebControls.Label DisplayLabel;
   public FirstPageClass fp;

   void Page_Load() 
   {
      if (!IsPostBack)
      {
         fp = (FirstPageClass) Context.Handler;
      } 
   }

}

A continuación se incluye un ejemplo completo de cómo crear una página de formularios Web Forms mediante un archivo de código en segundo plano para recibir los valores pasados desde otra página de formularios Web Forms. Asegúrese de que este ejemplo se denomina Secondpage.aspx.

<%@ Page Language="VB" Inherits="SecondPageClass" %>
<%@ Reference Page="firstpage.aspx" %>

<html>

<head>

</head> 

<body>

   <form runat="server">

      Hello <%=fp.FirstName%> <%=fp.LastName%>

   </form>

</body>

</html>
[C#]
<%@ Page Language="C#" Inherits="SecondPageClass" %>
<%@ Reference Page="firstpage.aspx" %>

<html>

<head>

</head> 

<body>

   <form runat="server">

      Hello <%=fp.FirstName%> <%=fp.LastName%>

   </form>

</body>

</html>

Vea también

@Page (Directiva) | HttpServerUtility.Transfer | TextBox | IHttpHandler | Handler