Cross-page posting nelle pagine Web ASP.NET
Aggiornamento: novembre 2007
Per impostazione predefinita, i pulsanti e gli altri controlli che generano un postback in una pagina Web ASP.NET inviano la pagina a se stessa. Tale impostazione fa parte del ciclo di round trip delle pagine Web durante la normale elaborazione. Per ulteriori informazioni, vedere Introduzione alle pagine Web ASP.NET.
In alcuni casi si desidera inviare una pagina a un'altra pagina. Ad esempio, si desidera creare un form a più pagine che raccoglie informazioni diverse su ogni pagina. In tal caso è possibile configurare determinati controlli nella pagina per l'invio a una pagina di destinazione diversa, in particolare i controlli che implementano l'interfaccia IButtonControl come, ad esempio, il controllo Button. Questo processo viene definito cross-page posting. Il cross-page posting presenta alcuni vantaggi rispetto all'utilizzo del metodo Transfer per reindirizzare a un'altra pagina. Per ulteriori informazioni, vedere Reindirizzamento degli utenti a un'altra pagina.
Nota: |
---|
È possibile inoltre utilizzare il controllo Wizard per creare form con più visualizzazioni. Per ulteriori informazioni, vedere Cenni preliminari sul controllo server Web Wizard. |
Poiché il cross-page posting è configurato per controlli singoli, è possibile creare una pagina che invia a pagine diverse in base al pulsante su cui l'utente fa clic.
Ottenere informazioni dalla pagina di origine
Quando si configura una pagina per il cross-page posting si desidera in genere ottenere informazioni dalla pagina di origine. Può trattarsi di informazioni sia dai controlli nella pagina, cioè informazioni inviate dal browser, sia da proprietà pubbliche della pagina di origine.
Ottenere i valori del controllo
La classe Page espone una proprietà denominata PreviousPage. Se le pagine di origine e di destinazione sono nella stessa applicazione ASP.NET, la proprietà PreviousPage nella pagina di destinazione contiene un riferimento alla pagina di origine. Se la pagina non è la destinazione di un cross-page posting o se le pagine si trovano in applicazioni diverse, la proprietà PreviousPage non viene inizializzata. Per impostazione predefinita, la proprietà PreviousPage è tipizzata come Page.
Nota: |
---|
Se le pagine di origine e destinazione si trovano in applicazioni diverse, non è possibile ottenere direttamente i valori dei controlli nella pagina ma è comunque possibile leggere i dati inviati dal dizionario Form. È impossibile leggere lo stato di visualizzazione dalla pagina di origine perché per esso è stato generato un hash. Se si desidera archiviare i valori nella pagina di origine e renderli disponibili nella pagina di destinazione in un'altra applicazione, è possibile archiviare i valori sotto forma di stringhe in campi nascosti nella pagina di origine e accedervi tramite Request.Form nella pagina di destinazione. |
Utilizzando il riferimento nella proprietà PreviousPage è possibile cercare i controlli nella pagina di origine ed estrarne i valori. Si utilizza a tal scopo il metodo FindControl.
Nota: |
---|
Se si sta codificando la pagina di origine specificatamente in modo che possa condividere le informazioni con le pagine di destinazione, è possibile utilizzare un metodo più semplice per rendere disponibili i valori dei controlli alla pagina di destinazione, ovvero esporli sotto forma di proprietà pubbliche. Per ulteriori informazioni, vedere Ottenere i valori delle proprietà pubbliche dalla pagina di origine più avanti in questo argomento. |
Nell'esempio di codice riportato di seguito viene illustrato come ottenere il valore del controllo TextBox1 nella pagina di origine.
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;
}
}
Il metodo FindControl trova i controlli nel contenitore di denominazione corrente. Se il controllo desiderato è annidato in un altro controllo, in genere in un modello, è necessario prima ottenere un riferimento al contenitore, quindi cercare il contenitore per trovare il controllo desiderato. Nell'esempio di codice riportato di seguito la pagina di origine contiene un controllo Login con un contenitore LayoutTemplate, che a sua volta contiene un controllo TextBox denominato UserName. Il codice ottiene il valore del controllo 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.";
}
Ottenere i valori delle proprietà pubbliche dalla pagina di origine
Nella pagina di destinazione di un cross-page posting è possibile ottenere anche i valori dei membri pubblici della pagina di origine. Lo scenario più diffuso è quello in cui la pagina di origine definisce le proprietà pubbliche e si desidera ottenerne i valori nella pagina di destinazione.
Nota sulla sicurezza: |
---|
Si consiglia di esporre solo le informazioni necessarie come proprietà pubbliche per ridurre la quantità di informazioni disponibili ad eventuali utenti malintenzionati. |
Per ottenere i membri pubblici della pagina di origine è necessario prima ottenere un riferimento fortemente tipizzato alla pagina di origine.
Questa operazione può essere eseguita in diversi modi. Il primo è includere nella pagina di destinazione una direttiva @ PreviousPageType che consenta di specificare la pagina di origine, come nell'esempio seguente:
<%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %>
Dopo aver incluso la direttiva, la proprietà PreviousPage è tipizzata fortemente alla classe della pagina di origine di riferimento, quindi sarà possibile fare riferimento direttamente ai membri pubblici della pagina di origine. È possibile specificare il tipo di pagina di origine direttamente, utilizzando un attributo type, o indirettamente, facendo riferimento in modo esplicito alla pagina di origine in un attributo VirtualPath, come illustrato nell'esempio.
Nell'esempio di codice riportato di seguito viene illustrata una parte della pagina di origine contenente una proprietà pubblica denominata CurrentCity che espone il valore di un controllo TextBox denominato textCity.
Public ReadOnly Property CurrentCity() As String
Get
Return textCity.Text
End Get
End Property
public String CurrentCity
{
get
{
return textCity.Text;
}
}
Nota: |
---|
Le proprietà nella pagina di origine create principalmente per esporre valori per il cross-page posting sono in genere in sola lettura. Anche se la pagina di origine può contenere proprietà pubbliche di lettura/scrittura, è inutile impostare una proprietà della pagina di origine dalla proprietà della pagina di destinazione perché il valore non sarà mantenuto. |
Se la pagina di destinazione contiene una direttiva PreviousPageType che punta alla pagina di origine, è possibile accedere alla proprietà CurrentCity della pagina di origine utilizzando il codice seguente.
Label1.Text = PreviousPage.CurrentCity;
Label1.Text = PreviousPage.CurrentCity;
Un altro modo per ottenere un riferimento fortemente tipizzato alla pagina di origine è includere una direttiva @ Reference nella pagina di destinazione che fa riferimento alla pagina di origine, nello stesso modo in cui si fa riferimento a qualsiasi altro tipo che si desidera utilizzare nella pagina. In tal caso, nella pagina di destinazione è possibile ottenere la proprietà PreviousPage della pagina di destinazione ed eseguirne il cast al tipo della pagina di origine, come nell'esempio di codice seguente.
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;
Verifica postback nella pagina di destinazione
Durante un cross-page postback, il contenuto dei controlli della pagina di origine viene inviato alla pagina destinazione e il browser esegue un'operazione HTTP di tipo POST e non GET. Tuttavia, nella pagina di destinazione la proprietà IsPostBack è false subito dopo un cross-page posting. Anche se il comportamento è analogo a quello di un POST, il cross-posting non è un postback alla pagina di destinazione. Quindi, la proprietà IsPostBack è impostata su false e la pagina di destinazione può essere eseguita per la prima volta.
Se è utile per l'applicazione, è possibile determinare se la pagina destinazione viene eseguita in seguito a un cross-page posting. A tal scopo è possibile testare la proprietà IsCrossPagePostBack del riferimento della pagina restituito dalla proprietà PreviousPage della pagina di destinazione, come nell'esempio di codice riportato di seguito.
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.";
}
Se la pagina corrente non è la destinazione di un cross-page posting, la proprietà PreviousPage restituisce null (Nothing in Visual Basic).
Per ulteriori informazioni, vedere Procedura: determinare come sono state richiamate le pagine Web ASP.NET.
Cross-page posting e Server.Transfer
La proprietà PreviousPage e la direttiva PreviousPageType sono utili nei due casi in cui si richiama la pagina di destinazione: in un cross-page postback, ovvero un trasferimento client, e con il metodo Transfer, ovvero un'operazione basata su server. In entrambi i casi, il codice nella pagina di destinazione può ottenere un riferimento alla pagina di origine utilizzando la proprietà PreviousPage.
Potrebbe essere importante nella pagina di destinazione determinare se la pagina è stata chiamata da un cross-page posting o da un'operazione Server.Transfer. A tale scopo, la classe Page espone una proprietà denominata IsCrossPagePostBack. Per informazioni dettagliate, vedere Procedura: determinare come sono state richiamate le pagine Web ASP.NET.
Vedere anche
Attività
Procedura: inviare pagine Web ASP.NET a una pagina diversa
Procedura: determinare come sono state richiamate le pagine Web ASP.NET