Il cross-page postback è un'altra delle novità introdotte con la versione 2.0 di ASP.NET, che ci permette di effettuare un postback su di una seconda pagina senza effettuare manualmente un redirect. In questo modo è possibile passare delle informazioni da una pagina all'altra senza l'utilizzo della sessione o di parametri di querystring.
La proprietà che ci permette di prelevare queste informazioni è la proprietà PreviousPage, mentre la proprietà PostbackUrl della classe Button, ci fa specificare l'url della pagina sulla quale effettuare il postback.
Vediamo un esempio:

pag1.aspx

Ricerca:<br />

<asp:TextBox id="txtRicerca" runat="server" /><br />
<asp:Button id="btn" runat="server" PostBackUrl="~/page2.aspx" Text="Ricerca" />

page2.aspx.cs
protected void Page_Load(object sender, EventArgs e)

{
if (!IsPostBack)
{
if (PreviousPage != null)
{
TextBox txtSearch = (TextBox)PreviousPage.FindControl("txtSearch");
if(txtSearch != null)
DoSearch(txtSearch.Text);
}
}
}

Cosa succede invece se la nostra pag1 eredita da una masterpage ?
La riga

TextBox txtSearch = (TextBox)PreviousPage.FindControl("txtSearch");

Ci ritorna un bell'errore. Questo perchè la nostra textbox di ricerca, non è più direttamente all'interno della pagina, ma è all'interno di un controllo ContentPlaceHolder. Quindi, dobbiamo prima prelevare l'oggetto contenitore, e poi il suo contenuto (cioè la nostra textbox). Vediamo come:

page1.aspx
<%@ Page Language="C#" MasterPageFile="~/site.master" ... %>

<asp:Content ID="Content1" ContentPlaceHolderID="center" Runat="Server">
Ricerca:<br />
<asp:TextBox id="txtRicerca" runat="server" /><br />
<asp:Button id="btn" runat="server" PostBackUrl="~/page2.aspx" Text="Ricerca" />
</asp:Content>

page2.aspx.cs
protected void Page_Load(object sender, EventArgs e)

{
if (!IsPostBack)
{
if (PreviousPage != null)
{
ContentPlaceHolder c = (ContentPlaceHolder)PreviousPage.Master.FindControl("center");
TextBox txtSearch = (TextBox)c.FindControl("txtSearch");
if(txtSearch != null)
DoSearch(txtSearch.Text);
}
}
}