Passaggio di valori di controlli server tra le pagine

Durante la creazione di un'applicazione Web Form è spesso necessario passare le informazioni da una pagina Web Form all'altra. In questo modo è possibile immettere le informazioni in un pagina Web Form e inviarle a un'altra pagina per l'elaborazione.

Il modello di progettazione per il passaggio di valori tra pagine Web Form che utilizzano codice inline è leggermente diverso da quello adottato nel caso si utilizzino i file di codice sottostante. La scelta del modello di progettazione dipende da se si desideri utilizzare codice inline o file di codice sottostante. Nella sezione che segue sono descritti entrambi i modelli di progettazione.

Modello di progettazione con codice inline

Quando si passano valori a un'altra pagina Web Form mediante il codice inline, è necessario innanzitutto specificare un nome di classe per la pagina Web Form contenente le informazioni da inviare. Specificare un nome di classe per la pagina Web Form includendo l'attributo ClassName insieme al nome della classe nella direttiva @ Page. Creare quindi una proprietà con una funzione di accesso get nella classe per ogni valore da condividere. La funzione di accesso get dovrebbe restituire il valore che si desidera passare, ad esempio il valore di una casella di testo. Per inviare le informazioni, trasferire il controllo dell'applicazione a una pagina Web Form diversa utilizzando il metodo Transfer dell'oggetto Server.

Nella pagina Web Form di ricezione indicare la classe dichiarata nella pagina di invio aggiungendo una direttiva @ Reference all'inizio della pagina con l'attributo Page impostato sulla pagina di invio. La pagina Web Form di ricezione potrà quindi accedere alle informazioni recuperando innanzitutto un'istanza del gestore che ha ricevuto per primo la richiesta HTTP dalla proprietà Handler dell'oggetto HttpContext. L'oggetto gestore verrà convertito in un'istanza della classe che incapsula le informazioni passate. Dopo aver eseguito la conversione, sarà possibile accedere ai valori passati tramite le proprietà dell'oggetto convertito.

Per creare una pagina Web Form che invia valori a un'altra pagina Web Form

  1. Specificare un nome di classe per la pagina Web Form di origine aggiungendo una direttiva @ Page all'inizio della pagina Web Form con l'attributo ClassName impostato su un nome di classe valido.

    <%@ Page Language="VB" ClassName="MyClassName" %>
    [C#]
    <%@ Page Language="C#" ClassName="MyClassName" %>
    
  2. Definire una proprietà con una funzione di accesso get nella classe per ogni valore da passare a un'altra pagina Web Form. La funzione di accesso get dovrebbe semplicemente restituire il valore che si desidera passare, ad esempio il valore di una casella di testo presente nella pagina Web Form. Le proprietà devono essere definite nello script del lato server.

    <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. Per passare le informazioni a un'altra pagina Web Form, quando ad esempio viene selezionato un pulsante, utilizzare il metodo HttpServerUtility.Transfer per terminare l'esecuzione sulla pagina corrente e trasferire il controllo dell'applicazione a un'altra pagina Web Form. Il metodo HttpServerUtility.Transfer accetta un singolo parametro che consente di specificare l'URL della pagina Web Form a cui si desidera trasferire il controllo.

    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");
    }
    

Di seguito è riportato un esempio completo di come creare una pagina Web Form mediante il codice inline per passare i valori di due controlli TextBox a un'altra pagina Web Form. Questo esempio deve essere denominato 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>

Per creare una pagina Web Form che riceve valori da un'altra pagina Web Form

  1. All'inizio della pagina Web Form che riceve le informazioni aggiungere una direttiva @ Reference con l'attributo Page impostato sulla pagina Web Form di origine, ovvero la pagina Web Form contenente le informazioni da passare.

    <%@ Reference Page="firstpage.aspx" %>
    
  2. Dichiarare una variabile nello script del lato server per archiviare un'istanza della classe definita nella pagina Web Form da cui vengono inviate le informazioni.

    <script runat="server">
       Dim fp As FirstPageClass
    </script>
    [C#]
    <script runat="server">
       FirstPageClass fp;
    </script>
    
  3. Creare un gestore eventi Page_Load personalizzato che assegni l'oggetto implementato IHttpHandler per la richiesta HTTP corrente alla variabile dichiarata nel passaggio precedente, quando la pagina Web Form non esegue il postback verso se stessa. Utilizzare la proprietà IsPostBack per determinare se la pagina esegue il postback. L'oggetto IHttpHandler implementato contiene un'istanza del gestore che ha ricevuto per primo la richiesta HTTP. Poiché l'oggetto implementato IHttpHandler non è dello stesso tipo della variabile dichiarata nel passaggio precedente, prima di assegnarlo alla variabile è necessario convertirlo nella classe che incapsula le informazioni inviate dalla prima pagina Web Form. Recuperare l'oggetto gestore utilizzando la proprietà Handler dell'oggetto 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. La variabile dichiarata nel secondo passaggio conterrà ora un'istanza della classe che incapsula le informazioni provenienti dalla pagina Web Form precedente. Utilizzare tale variabile per accedere alle proprietà della classe contenente le informazioni inviate dalla pagina Web Form precedente. È possibile accedere a questi valori a livello di programmazione per eseguire un calcolo o semplicemente visualizzarli utilizzando i delimitatori di script <%= e %>.

    Hello <%=fp.FirstName%>
    

Nell'esempio che segue è illustrata una pagina Web Form che riceve due valori da un'altra pagina Web Form. I valori vengono quindi visualizzati sulla pagina Web Form. Questo esempio deve essere denominato 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>

Modello di progettazione con file di codice sottostante

Quando si utilizzano file di codice sottostante, tali file contengono una dichiarazione di classe per il codice associato alla pagina Web Form. Nel file di codice sottostante la pagina Web Form che invia le informazioni, creare innanzitutto una proprietà con una funzione di accesso get nella classe per ogni valore da condividere. La funzione di accesso get dovrebbe restituire il valore che si desidera passare, ad esempio il valore di una casella di testo. Per inviare le informazioni, trasferire il controllo dell'applicazione a una pagina Web Form diversa utilizzando il metodo Transfer dell'oggetto Server.

Nella pagina Web Form di ricezione indicare la classe dichiarata nella pagina di invio aggiungendo una direttiva @ Reference all'inizio della pagina con l'attributo Page impostato sulla pagina di invio. Sarà possibile quindi recuperare un'istanza del gestore che ha ricevuto per primo la richiesta HTTP dalla proprietà Handler dell'oggetto HttpContext.

Nota   Per rendere disponibile la classe dichiarata nella pagina Web Form di invio nel file di codice sottostante della pagina Web Form di ricezione, è necessario compilare manualmente in un singolo file DLL i file di codice sottostante di ogni pagina Web Form utilizzando il compilatore della riga di comando. Il file DLL deve essere quindi inserito nella directory \Bin dell'applicazione Web Form.

L'oggetto gestore verrà convertito in un'istanza della classe che incapsula le informazioni passate. Dopo aver eseguito la conversione, sarà possibile accedere ai valori passati tramite le proprietà dell'oggetto convertito.

Per inviare i valori dei controlli server da una pagina Web Form differente

  1. Creare un file di codice sottostante per la pagina Web Form di invio contenente una dichiarazione di classe per il codice associato alla pagina.

    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. Per accedere ai controlli server della pagina Web Form nella classe dichiarata nel file di codice sottostante, dichiarare le variabili protette nella classe per rappresentare i controlli server a cui si desidera accedere.

    Protected FirstNameTextBox As System.Web.UI.WebControls.TextBox 
    [C#]
    protected System.Web.UI.WebControls.TextBox FirstNameTextBox;
    
  3. Nella classe dichiarata nel primo passaggio definire una proprietà con una funzione di accesso get per ogni valore da passare a una pagina Web Form. La funzione di accesso get dovrebbe semplicemente restituire il valore che si desidera passare, ad esempio il valore di una casella di testo presente nella pagina Web Form.

    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. Per passare le informazioni a una pagina Web Form differente, quando ad esempio viene selezionato un pulsante, utilizzare il metodo HttpServerUtility.Transfer per terminare l'esecuzione sulla pagina corrente e trasferire il controllo dell'applicazione a un'altra pagina Web Form. Il metodo HttpServerUtility.Transfer accetta un singolo argomento che consente di specificare l'URL della pagina Web Form a cui si desidera trasferire il controllo.

    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. Creare l'interfaccia per la pagina Web Form che invia le informazioni. Aggiungere un attributo Inherits alla direttiva @ Page impostata sulla classe dichiarata nel file di codice sottostante.

    <%@ 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>
    

Di seguito è riportato un esempio completo del file di codice sottostante associato alla pagina Web Form che invia le informazioni. A seconda che si utilizzi Visual Basic o C#, denominare questo esempio rispettivamente Firstpage.aspx.vb o Firstpage.aspx.cs.

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"); 
   }

}

Di seguito è riportato un esempio completo di come creare una pagina Web Form utilizzando un file di codice sottostante, per passare i valori di due controlli TextBox a un'altra pagina Web Form. Questo esempio deve essere denominato 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>

Per ricevere i valori dei controlli server da una pagina Web Form differente

  1. Creare un file di codice sottostante per la pagina Web Form di ricezione contenente una dichiarazione della classe per il codice associato alla pagina.

    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. Per accedere ai controlli server della pagina Web Form nel file di codice sottostante, dichiarare le variabili protette nella classe per rappresentare i controlli server a cui si desidera accedere.

    Protected FirstNameTextBox As System.Web.UI.WebControls.TextBox 
    [C#]
    protected System.Web.UI.WebControls.TextBox FirstNameTextBox;
    
  3. Dichiarare nella classe una variabile per archiviare un'istanza della classe definita nella pagina Web Form che invia le informazioni. Per rendere disponibile una variabile nella pagina di ricezione Web Form, renderla pubblica.

    Nota   Non è possibile accedere alla classe definita nella pagina Web Form che invia le informazioni finché i file di codice sottostante di ogni pagina Web Form non sono stati compilati in un unico file DLL. Tale file deve essere inserito nella directory \Bin dell'applicazione Web. Questo processo è descritto in un passaggio successivo.

    Public fp As FirstPageClass
    [C#]
    public FirstPageClass fp;
    
  4. Creare un gestore eventi Page_Load personalizzato che assegni l'oggetto implementato IHttpHandler per la richiesta HTTP corrente alla variabile dichiarata nel passaggio precedente, quando la pagina Web Form non esegue il postback verso se stessa. Utilizzare la proprietà IsPostBack per determinare se la pagina esegue il postback. L'oggetto IHttpHandler implementato contiene un'istanza del gestore che ha ricevuto per primo la richiesta HTTP. Poiché l'oggetto implementato IHttpHandler non è dello stesso tipo della variabile dichiarata nel passaggio precedente, prima di assegnarlo alla variabile è necessario convertirlo nella classe che incapsula le informazioni inviate dalla prima pagina Web Form. Recuperare l'oggetto gestore utilizzando la proprietà Handler dell'oggetto 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. La variabile dichiarata nel terzo passaggio contiene un'istanza della classe che incapsula le informazioni dalla pagina Web Form precedente. Utilizzare tale variabile per accedere alle informazioni inviate dalla pagina Web Form precedente. È possibile accedere a questi valori a livello di programmazione per eseguire un calcolo o semplicemente visualizzarli utilizzando i delimitatori di script <%= e %>.

    Hello <%=fp.FirstName%>
    
  6. Creare l'interfaccia per la pagina Web Form che invia le informazioni. Nella direttiva @ Page aggiungere un attributo Inherits impostato sulla classe dichiarata nel file di codice sottostante.

    <%@ 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. All'inizio della pagina Web Form che riceve le informazioni aggiungere una direttiva @ Reference con l'attributo Page impostato sulla pagina Web Form di origine, ovvero la pagina Web Form contenente le informazioni da passare.

    <%@ Reference Page="firstpage.aspx" %>
    
  8. Le pagine Web Form di invio e ricezione delle informazioni saranno quindi completate. Prima di poter eseguire correttamente l'applicazione, sarà tuttavia necessario compilare insieme i file di codice sottostante di ogni pagina in un unico file DLL. Tale file deve essere inserito nella directory \Bin dell'applicazione Web. In tal modo sarà possibile accedere alla classe dichiarata nella pagina Web Form di invio dalla pagina Web Form di ricezione. Per compilare i file di codice sottostante, immettere il seguente comando nella riga di comando:

    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
    

Di seguito è riportato un esempio completo del file di codice sottostante associato alla pagina Web Form che riceve le informazioni. A seconda che si utilizzi Visual Basic o C#, questo esempio deve essere denominato rispettivamente Secondpage.aspx.vb o Secondpage.aspx.cs.

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;
      } 
   }

}

Di seguito è riportato un esempio completo di come creare una pagina Web Form utilizzando un file di codice sottostante per ricevere i valori passati da una pagina Web Form differente. Questo esempio deve essere denominato 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>

Vedere anche

Direttiva @Page | HttpServerUtility.Transfer | TextBox | IHttpHandler | Handler