Passare dati fra WebForm

Nota

Sul forum di asp.net ho trovato un riferimento ad un post si Haissam. Mi è sembrato molto ben fatto e visto che questo problema ritorna con un'increadibile frequenza nei forum ho deciso di postare qui una traduzione dell'articolo sperando che possa aiutare i programmatori italiani:

 

In questo post, vi mostrerò diversi modi di passare informazioni fra webform. Si possono adottare diverse tecniche, dipende tutto da cosa vi serve!

Sappiamo tutti che l'Http non gestisce lo stato, quindi le informazioni dovranno essere salvate da qualche parte per poterle poi recuperare.

  1. Query String
  2. Cookies
  3. Variabili di Sessione
  4. Cross Page Postback
  5. Form Submit
  6. Server.Trasnfer o Server.Execute


Parleremo in dettaglio di ognuna specificando quali tipi possono lavorare.

1) QueryString:

Usando le variabili in query string puoi passare varibili fra webform. Supponiamo che tu debba passare il contenuto di TextBox1.Text da WebForm1 a WebForm2 alla pressione di un pulsante:

   1:  protected void Button1_Click(object sender, EventArgs e)
   2:  {
   3:      Response.Redirect("WebForm2.aspx?id=" + TextBox1.Text);
   4:  }

Per leggere il valore di "id" da WebForm2:

   1:  string queryStringID = Request.QueryString["id"];

2) Cookies:

Come probabilmente già sai, i cookies sono piccoli file di testo salvati sul client. I Cookie possono contenere massimo 4kb circa. Da quando i cookie si trovano sul client ad ogni richiesta del client al tuo sito, il browser cerca i cookie e li spedisce nell'oggetto Request.

Es: Per Salvare il valore di TextBox1.Text in un cookie:

   1:  protected void Button1_Click(object sender, EventArgs e)
   2:  {
   3:      HttpCookie cookie = new HttpCookie("UserName");
   4:      cookie.Value = TextBox1.Text;
   5:      cookie.Expires = DateTime.Now.AddDays(1);
   6:      Response.Cookies.Add(cookie);
   7:      Response.Redirect("WebForm2.aspx");
   8:  }

Adesso nel Page_Load di WebForm2, possiamo leggere il valore:

   1:  if(Request.Cookies["UserName"] != null)
   2:  {
   3:      Response.Write(Request.Cookies["UserName"].Value);
   4:  }

3) Variabili di Sessione:

Per Default le variabili di sessione sono salvate nella memoria del webserver. Le Sessioni sono uniche per ogni utente.

Per salvare una variabile di sessione:

   1:  protected void Button1_Click(object sender, EventArgs e)
   2:  {
   3:      Session["UserName"] = TextBox1.Text;
   4:      Response.Redirect("WebForm2.aspx");
   5:  }

Per leggere il valore da WebForm2:

   1:  Response.Write(Session["UserName"]);

4) Cross Page Postback (ASP.NET 2.0):

Il cross page postback è stato introdotto con l'ASP.NET 2.0. Ho già scritto un post in merito.

Ex: Setta la proprietà PostBackUrl di Button1 indirizzandolo a WebForm2.aspx.

Inserisci questo codice in WebForm2 per leggere il valore di TextBox1:

   1:  TextBox txtFirstPage = (TextBox)(PreviousPage.FindControl("TextBox1"));
   2:  Response.Write(String.Format("You wrote {0} in Page1",txtFirstPage.Text));

5) Submit Form:

Possimao eseguire il submit di un form in WebForm1.aspx a webform2.aspx. In questo caso possiamo recuperare tutti gli elementi contenuti nel form di webform1 da webform2. Quello che faremo in questo esempio è di aggiungere un altro form (non server side) che conterrà due controlli html. Il primo sarà un submit ed il secondo sarà un campo hidden che conterrà il valore del controllo server TextBox1 per poter essere inviato a webform2.

   1:  <form id="Form1" method="post" runat="server">
   2:      <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
   3:  </form>
   4:  <form name="SubmittedForm" action="WebForm2.aspx" method="post">
   5:      <input id="Submit1" type="submit" value="submit" onclick="CopyTextToHiddenField()" />
   6:      <input name="Hidden1" type="hidden" />
   7:  </form>

Ovviamente ti sarai accorto che abbiamo gestito l'evento onclick del controllo submit che chiamerà una funzione javascript per copiare il valore di TextBox1 nel campo hidden (Hidden1) per poter essere inviato a WebForm2. Avrai anche notato l'attributo action del secondo form in cui specifichiamo in quale pagina dobbiamo essere reindirizzati.

Aggiungiamo questo javascript nella <head> di WebForm1

   1:  <script language="javascript">
   2:      function CopyTextToHiddenField()
   3:      {
   4:          var textbox1Value = document.getElementById("<%=TextBox1.ClientID%>").value;
   5:          document.forms[1].document.getElementById("Hidden1").value = textbox1Value;
   6:      }
   7:  </script>

Adesso possiamo recuperare il valore di Hidden1 da WebForm2 con questo codice:

   1:  Response.Write(Request.Form["Hidden1"]);   

6) Server.Transfer e Server.Execute

Queste due funzioni accettano 2 parametri. Il primo è il nome della webform a cui si vuol fare il redirect, il secondo è un parametro booleiano che specifica se il form debba essere preservato.

   1:  protected void Button1_Click1(object sender, EventArgs e)
   2:  {
   3:      Server.Transfer("WebForm2.aspx", true);
   4:  }

Adesso nel page_load di  WebForm2 possiamo usare questo codice per leggere il valore di TextBox1

   1:  Response.Write(Request.Form["TextBox1"]);

il codice per Server.Execute è identico.


Spero che questo post possa essere d'aiuto e ringrazio Haissam per avermi autorizzato alla pubblicazione della traduzione.

Per eventuali domande/suggerimenti/altro contattatemi pure.

Link al post originale di Haissam 

Technorati Tag: ,,

Custom Event in Custom Control

Introduzione

In una logica di programmazione basata su i controlli è normale avere la necessità di creare eventi per comunicare con la pagina o più in generale con l'oggetto contenitore. In questo articolo vedremo come fare passo dopo passo.

Nonostante la tecnica per la gestione degli eventi nei controlli server e nei controlli client (ascx) sia identica, la solution allegata contiene esempi di realizzazione con entrambi i tipi di controllo.

Cosa vogliamo realizzare?

Un semplice controllo dotato di un textbox e un pulsante. Alla pressione del pulsante il controllo deve generare un evento in cui notifica il valore contenuto nella textbox. La Pagina contenitore intercetta l'evento del controllo e scrive il testo notificato in una label.

Lista della spesa: Di cosa abbiamo bisogno?

1) un Delegate: un delegate è un modo per rappresentare la signtaure di un metodo: Quanti e quali parametri deve avere e qual'è il tipo restituito dalla funzione? Nel nostro caso rappresenta "come deve essere fatta" la funzione di risposta all'evento http://msdn.microsoft.com/it-it/library/900fyy8e(en-us).aspx

2) un Evento: Semplicemente abbiamo bisogno di definirlo come attributo e specificare il delagate a cui fa riferimento

Parte 1 - Prepariamo il nostro evento:

Iniziamo con il dichiarare nel nostro controllo il delegate e l'evento:

        /// <summary>
        /// Event Delegate: How answering function must be?
        /// </summary>
        /// <param name="text"></param>
        public delegate void dlgSubmitText(string text);
 
        /// <summary>
        /// Evant object refearing to dlgSubmitText
        /// </summary>
        public event dlgSubmitText SubmitText;

 

In pratica abbiamo detto che nel nostro controllo esiste un evento la cui funzione di risposta ha un parametro di tipo stringa e non restisce valori.

Parte 2 - Invochiamo l'evento

Dobbiamo intercettare la pressione del pulsante interno al controllo in modo da poter generare l'evento.

        void Btn_Click(object sender, EventArgs e)
        {
            //Retrive TextBox object
            TextBox Txt = (this.FindControl("Txt") as TextBox);
            
            //Invoke Event with txt.text as parameter
            //!!! It's important to check if SubmitText is managed by (SubmitText != null) before to invoke event
            if (SubmitText != null){SubmitText.Invoke(Txt.Text);}
        }

E' molto importante ricordarsi l'if(SubmitText != null) perchè se l'evento non fosse gestito dal contenitore avremmo un'eccezione.

Parte 3 - Il controllo è pronto proviamolo:

Creiamo una pagina aspx per gestire il contollo ed il suo evento. Nel nostro caso quando intercettiamo l'evento scriviamo il testo che ci arriva come parametro in una label.

ASPX:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Namespace="wmb" TagPrefix="wmb" %>
<%@ Register Src="~/MyAscxControl.ascx" TagPrefix="wmb" TagName="MyAscxControl" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <wmb:MyControl id="MyControl" runat="Server" OnSubmitText="MyControl_SubmitText"></wmb:MyControl><br />
        <wmb:MyAscxControl ID="AscxControl" runat="server" OnSubmitText="AscxControl_SubmitText" /><br />
        <br />
        <asp:Label ID="lblResult" runat="server"></asp:Label>
    </div>
    </form>
</body>
</html>

CS:

public partial class _Default : System.Web.UI.Page 
{
    /// <summary>
    /// Custom event Managment (Server Control)
    /// </summary>
    /// <param name="text"></param>
    public void MyControl_SubmitText(string text)
    {
        lblResult.Text = "Server Event Text:" + text;
    }
 
    /// <summary>
    /// Custom event Managment (Ascx Control)
    /// </summary>
    /// <param name="text"></param>
    public void AscxControl_SubmitText(string text)
    {
        lblResult.Text = "ASCX Event Text:" + text;
    }
}

Conclusioni e Sorgente:

Come avete potuto vedere il procedimento è molto semplice, flessibile ed offre grandi possibilità.

Per ogni suggerimento su come migliorare quest'articolo, domande o altro scrivetemi pure.

 

 

«maggio»
domlunmarmergiovensab
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567