Pagina personale di:
Carlo Vecchio
appunti di C#, R, SQL Server, ASP.NET, algoritmi, numeri
Vai ai contenuti

ASP.NET - Navigazione pagine

ASP.NET

Navigazione tra le pagine

  • Ci sono diverse tecniche per muoversi da una WebForm ad un’altra.

Controllo HyperLink
  • Nella proprietà ‘NavigateURL’ si imposta l’indirizzo della pagina verso la quale si vuole navigare.
  • Il controllo HyperLink è trasformato da ASP.NET in un tag <a>.
  • La pagina può essere dello stesso sito o una pagina qualsiasi del Web.
  • Il Browser mantiene la storia della navigazione.
  • Per una descrizione delle proprietà più importanti, si veda la pagina dedicata al controllo. (HyperLink).

Response Redirect
  • Il metodo Response.Redirect() è utile per intercettare un evento click sul Server. Infatti è utilizzato con i tre tipi di bottoni: ‘Button’, ‘LinkButton’, ‘ImageButton’: basta lanciare il metodo nell’evento Click().
  • Quando un utente fa un click su un bottone, il Web Server riceve una richiesta di reindirizzamento e risponde con un ‘Header’ al Client. Automaticamente il Client genera un altro GET verso il Server con la nuova pagina che infine il Server trasmette. Riassumendo, il Response.Redirect causa due cicli di invio e ricevimento dati tra Client e Server.
  • La pagina può essere dello stesso sito o una pagina qualsiasi del Web.
  • Il Browser mantiene la storia della navigazione.
  • Esempio.
  • Design:


  • Codice HTML:

   <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Vai a Bing" />
   
<br />
   
<br />
   
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Vai a Google" />

  • Codice C#:

   protected void Button1_Click(object sender, EventArgs e)
   {
       Response.Redirect(
"http://www.bing.com");
   }

   
protected void Button2_Click(object sender, EventArgs e)
   {
       Response.Redirect(
"http://www.google.com");
   }


Server Transfert

  • La pagina può essere solo dello stesso sito (non una pagina qualsiasi del Web).
  • L’indirizzo del Browser non viene modificato.
  • Server.Transfert() è più veloce di Response.Redirect() perché avviene in un solo ciclo di invio e ricevimento dati tra Client e Server.
  • Le variabili della WebForm che chiama il Server.Transfert(), possono essere lette dalla WebForm chiamata.
  • Esempio: si ha la WebForm ‘Index.aspx’ che chiama la WebForm ‘WebForm2.aspx’ con il metodo ‘Server.Transfert’. Il metodo è nel bottone ‘Button1’. Nella prima WebForm è anche presente la TextBox ‘txtInput’ e il contenuto di questo oggetto viene letto nella seconda WebForm.
  • Design della WebForm ‘Index.aspx’:




  • Codice HTML della WebForm ‘Index.aspx’:

   <asp:TextBox ID="txtInput" runat="server"></asp:TextBox>
   
<br />
   
<br />
   
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Vai a WebForm2" />

  • Codice C# della WebForm ‘Index.aspx’:

   protected void Button1_Click(object sender, EventArgs e)
   {
       Server.Transfer(
"~/WebForm2.aspx", true);
   }

  • Codice C# della WebForm ‘WebForm2.aspx’:

   protected void Page_Load(object sender, EventArgs e)
   {
       System.Collections.Specialized.
NameValueCollection prevForm = Request.Form;
       Response.Write(
"txtInput della pagina 'index.aspx': " + prevForm["txtInput"]);
   }

  • Il metodo Response.Transfert() ha il secondo parametro (default ‘true’) che fa sì che gli oggetti della prima WebForm siano leggibili dalla seconda WebForm. Nel caso che il parametro sia ‘false’, la Collection non conterrà alcun valore.
  • Esiste però un altro modo per leggere le proprietà degli oggetti della prima WebForm, anche se viene passato ‘false’ al metodo Response.Transfert(). Il codice seguente, posto nella seconda WebForm, ne è un esempio.

   Page prevPage = Page.PreviousPage;
   
if (prevPage != null)
   {
       Response.Write(
"txtInput della pagina 'index.aspx': " +
           ((
TextBox)prevPage.FindControl("txtInput")).Text);
   }

Server Execute
  • La pagina può essere solo dello stesso sito (non una pagina qualsiasi del Web).
  • L’indirizzo del Browser non viene modificato.
  • Le variabili della WebForm che chiama il Server.Execute(), possono essere lette dalla WebForm chiamata.
  • Differenza tra Server.Transfert() e Server.Execute():
- Server.Transfert() ferma l’esecuzione della pagina corrente e trasferisce l’esecuzione alla WebForm chiamata.
- Server.Execute() dopo aver terminato l’esecuzione della WebForm chiamata, ritorna alla pagina corrente. Questo comporta che nella pagina visualizzata (nel Browser rimane l’indirizzo della prima WebForm) ci sono i controlli della WebForm2 e più sotto i controlli della WebForm1.
  • Per esempio, se la WebForm1 è fatta così:



  • Con il Server.Tranfert(), appaiono i controlli della WebForm2:




  • Con il Server.Execute(), appaiono i controlli della WebForm1 e della WebForm2:



Cross-Page posting

  • Il Cross-Page posting si ha ogni volta che si fa clic su un Button, LinkButton, ImageButton.
  • Nella proprietà ‘PostBackUrl’ si imposta la WebForm sulla quale si vuole andare. Se questa proprietà non viene impostata, il PostBack avviene sulla pagina stessa.
  • Esempio:

   <asp:Button ID="Button1" runat="server"
       
Text="Vai a WebForm2" PostBackUrl="~/WebForm2.aspx" />

  • La proprietà ‘IsCrossPagePostBack’ (dell’oggetto Page.PreviousPage) permette di verificare se si è arrivati in una pagina tramite un PostBack. La proprietà è utile quando si vogliono leggere proprietà della pagina precedente.
  • Se per esempio si fa un Cross-Page tra la WebForm1 e la WebForm2, nella WebForm2 si leggono proprietà dei controlli della WebForm1 con il seguente codice:

   protected void Page_Load(object sender, EventArgs e)
   {
       
Page prevPage = Page.PreviousPage;
       
if (prevPage != null && prevPage.IsCrossPagePostBack)
       {
           
string txt = ((TextBox)prevPage.FindControl("txtInput")).Text;
           Response.Write(txt);
       }
   }

  • Il metodo FindControl() può essere pericoloso, perché come argomento si passa una stringa e il compilatore non rileva errori in caso di digitazione errata. Un eventuale errore avviene quindi in ambiente di esecuzione.
  • Per evitare questo tipo di errori si può utilizzare un’altra tecnica che definisce variabili con un tipo strettamente definito. La compilazione evidenzia eventuali errori di digitazione.
  • Esempio.
  • Nella WebForm1 si definiscono una o più proprietà pubbliche, con solo il ‘get’.

   // Proprietà pubblica, solo get.
   
public string TextBox_txtInput
   {
       
get { return txtInput.Text; }
   }

  • Nella WebForm2 leggere le proprietà con il seguente codice:

   WebForm1 prevPage = (WebForm1) Page.PreviousPage;
   
if (prevPage != null && prevPage.IsCrossPagePostBack)
   {
       
string txt = prevPage.TextBox_txtInput;
       Response.Write(txt);
   }

Window Open
  • La funzione JavaScript ‘window.open()’ permette l’apertura di una nuova WebForm.
  • Esempio di base con un bottone HTML (non un ASP button).
  • Nell’evento ‘onclick()’ basta chiamare la funzione:


   <input id="Button1" type="button" value="button"
       
onclick="window.open('WebForm2.aspx')" />

  • Notare che window.open ha diversi parametri con i quali si possono controllare alcune proprietà della WebForm che si va ad aprire.

Passaggio di parametri
  • Se si vogliono passare dei parametri alla WebForm da aprire, si possono utilizzare le Query Strings. Esse si aggiungono all’indirizzo della pagina richiesta in questo formato:

   indirizzo?parametro1=valore1[&parametro2=valore2&…&parametroN=valoreN]

  • Per esempio, si ha la WebForm1 con le due TextBox txtNome e txtCognome. Si vuole passare questi due valori alla WebForm2 e li si vogliono mostrare nelle due Label lblNome e lblCognome nella WebForm2.
  • Conviene definire la funzione JavaScript:

   <script type="text/javascript">
       
function OpenWindowsNomeCognome() {
           
var Nome = document.getElementById('txtNome').value;
           
var Cognome = document.getElementById('txtCognome').value;

           window.open(
'WebForm2.aspx?Nome=' + Nome + '&Cognome=' + Cognome,
                       '_blank', 'location=no,resizable=0,width=100,height=100', true);
       }
   
</script>

  • A titolo di esempio nella ‘windows.open()’ si sono passati i seguenti parametri:
- Indirizzo da aprire seguito dalle variabili secondo il formato delle Query String.
- ‘_blank’ per indicare di aprire la WebForm in un’altra finestra.
- Features: caratteristiche della finestra: ‘location’ per indicare se presente la barra di navigazione, ‘resizable’ se la finestra è ridimensionabile e le dimensioni. Attenzione: alcune caratteristiche sono eseguite più o meno bene dai Browser, altre sono ignorate da altri Browser.
- Replace: solo per WebForm caricate nella stessa finestra, indica se creare un nuovo valore nella storia delle finestre aperte.
  • Si può richiamare la funzione appena definita da HTML Button o da ASP Button.
  • Esempio da HTML Button:

   <input id="Button1" type="button" value="Button"
       
onclick="OpenWindowsNomeCognome();" />

  • Esempio da ASP Button:

   <asp:Button ID="Button2" runat="server" Text="Button"
       
OnClientClick="OpenWindowsNomeCognome();" />

  • Nella WebForm2 si leggono i parametri passati dalla Query String con il seguente codice:

   protected void Page_Load(object sender, EventArgs e)
   {
       lblNome.Text = Request.QueryString[
"Nome"];
       lblCognome.Text = Request.QueryString[
"Cognome"];
   }

Apertura WebForm da Server
  • Anche da Server è possibile eseguire del codice JavaScript per aprire una WebForm. Basta utilizzare il metodo ‘Response.Write()’ passando lo script.
  • Esempio:

   protected void Button3_Click(object sender, EventArgs e)
   {
       
// Necessita di using System.Text.
       
StringBuilder sb = new StringBuilder();
       sb.Append(
"<script>");
       sb.Append(
"window.open('WebForm2.aspx?");
       sb.Append(
"Nome=" + txtNome.Text);
       sb.Append(
"&Cognome=" + txtCognome.Text);
       sb.Append(
"');");
       sb.Append(
"</script>");

       Response.Write(sb.ToString());
   }

  • Attenzione però che il blocco Popup del Browser potrebbe impedire l’apertura di questa finestra.


© 2020 Carlo Vecchio
Torna ai contenuti