Con questo post inauguro una nuova serie dedicata alle novità meno "sbandierate"  di ASP.NET 2.0, trattando come primo argomento l'introduzione del Cross-Page Postback.

Se in ASP.NET 1.x vogliamo gestire i postback in pagine separate, siamo "costretti" ad utilizzare il Response.Redirect per reindirizzare il browser verso il diverso gestore con una sintassi del tipo:

Response.Redirect("Page2.aspx?textbox1=" + HttpUtility.UrlEncode(TextBox1.Text));

oppure

Server.Transfer("Page2.aspx");

Il Server.Transfer, a differenza del Response.Redirect, elimina il round-trip con il client e condivide lo stesso flusso di informazioni tra le due pagine consentendo l'accesso alla pagina chiamante attraverso l'istruzione: 

Page previousPage = (Page) Context.Handler;

In aggiunta a queste tecniche, ASP.NET 2.0 consente la dichiarazione della pagina di postback direttamente nel controllo server. In questo caso un possibile controllo asp:button potrebbe essere composto come di seguito:

ID="button1" Text="OK" PostBackUrl="Page2.aspx" Runat="Server" />

L'attributo PostBackUrl indica, infatti, la pagina che gestirà il postback generato da quel controllo. La nostra ipotetica Page2.aspx potrà accedere al flusso di informazioni della pagina chiamante tramite l'utilizzo di una nuova proprietà di tipo Page: PreviuosPage. La proprietà consente l'accesso ai controlli della pagina chiamante attraverso l'uso del metodo FindControl. Se invece conosciamo il tipo di pagina chiamante, possiamo utilizzare la direttiva @PreviousPageType in questo modo:

<%@ PreviousPageType VirtualPath="Page1.aspx" %>

e da codice accedere a tutti i controlli pubblici (1):

void Page_Load(object sender, EventArgs e)
{
    
if (Page.IsCrossPagePostBack)
    {
        
string text1 = PreviousPage.TextBox1.Text;
    }
    ...
}

L'accesso dichiarativo alla pagina chiamante è, dal mio punto di vista, una possibilità decisamente più comoda.

update (1) - 13/12/2005: ASP.NET 2.0 non consente il cambio del modificatore di accesso dei controlli. Un trucco per accedere al controllo è costruire una proprietà adhoc nella partial class. Il suggerimento è quello di creare proprietà specifiche per accedere ai campi dei controlli da modificare.

partial class _Default
{
    // Accedo al controllo
    public 
TextBox TestBox1
    {
        
get {return _textBox1;
    }
    // Accedo alla proprietà
    public string
 Testo
    {
        
get {return _textBox1.Text;
    }
}

powered by IMHO 1.3