多個(gè)頁(yè)面向同一目標(biāo)頁(yè)面PostBack的問題

1. 如果是單個(gè)頁(yè)面 A.aspx  傳遞參數(shù) 到頁(yè)面 B.aspx,可以通過設(shè)置A中的postBackUrl="~/B.aspx",或者使用 Server.Transfer("~/B.aspx")。在目標(biāo)頁(yè)面 B.aspx 中,通過 PreviousPageType VirtualPath="~/A.aspx" 的強(qiáng)類指定源頁(yè)面 A.aspx。這樣,可以在B.aspx中通過 FindControl() 來獲得A.aspx中的控件;或者,在A.aspx中把控件定義為公共屬性,這樣,在B.aspx中可以直接按 A.property 的方式訪問

2. 當(dāng)多個(gè)頁(yè)面 A1.aspx, A2.aspx,..., An.aspx 同時(shí)要傳遞參數(shù)到頁(yè)面 B.aspx 時(shí),同樣我們可以使用 postBackUrl或者Server.Transfer()機(jī)制建立聯(lián)系。但是這個(gè)時(shí)候,由于A1,A2,...,An可能是不同類型的頁(yè)面,故無法直接使用PreviousPageType VirtualPath 的強(qiáng)類指定,而且,在.aspx 中關(guān)鍵字 PreviousPageType 也只能出現(xiàn)一次。這個(gè)時(shí)候的解決辦法是,在B.aspx中不使用關(guān)鍵字 PreviousPageType,而在B.aspx.cs中通過如下代碼來判定是哪個(gè)源頁(yè)面是PreviousPage:

if (Page.PreviousPage.AppRelativeVirtualPath == "~/A1.aspx")
{
    Label lblA1= (Label)Page.PreviousPage.FindControl("lblA1");
    ...
}
else if(Page.PreviousPage.AppRelativeVirtualPath == "~/A2.aspx")
{
    ...
}
else if ...
{
    ...
}

這里同樣使用 FindControl() 來獲得源頁(yè)面的控件引用。直接通過屬性訪問的方式應(yīng)該也可以,我沒有再測(cè)試

3. 網(wǎng)上提到過一種方法,就是使用Interface來解決,有興趣的可以研究研究:

http://pluralsight.com/blogs/fritz/archive/2005/10/14/15566.aspx

我是試了半天,沒有成功,就放棄了。

4. 順便說一下 FindControl()

最常見也最讓人頭疼的就是 "Object reference not set to an instance of an object" 錯(cuò)誤了。因?yàn)镕indControl()需要從上往下逐級(jí)才能找到目標(biāo)控件,特別是使用了master page的時(shí)候就更加麻煩。這個(gè)時(shí)候,需要使用如下的訪問形式:

Label lblA1= (Label)Page.PreviousPage.FindControl("ctl00$ContentPlaceHolder1$lblA1");