多个页面向同一目标页面PostBack的问题

1. 如果是单个页面 A.aspx  传递参数 到页面 B.aspx,可以通过设置A中的postBackUrl="~/B.aspx",或者使用 Server.Transfer("~/B.aspx")。在目标页面 B.aspx 中,通过 PreviousPageType VirtualPath="~/A.aspx" 的强类指定源页面 A.aspx。这样,可以在B.aspx中通过 FindControl() 来获得A.aspx中的控件;或者,在A.aspx中把控件定义为公共属性,这样,在B.aspx中可以直接按 A.property 的方式访问

2. 当多个页面 A1.aspx, A2.aspx,..., An.aspx 同时要传递参数到页面 B.aspx 时,同样我们可以使用 postBackUrl或者Server.Transfer()机制建立联系。但是这个时候,由于A1,A2,...,An可能是不同类型的页面,故无法直接使用PreviousPageType VirtualPath 的强类指定,而且,在.aspx 中关键字 PreviousPageType 也只能出现一次。这个时候的解决办法是,在B.aspx中不使用关键字 PreviousPageType,而在B.aspx.cs中通过如下代码来判定是哪个源页面是PreviousPage:

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

这里同样使用 FindControl() 来获得源页面的控件引用。直接通过属性访问的方式应该也可以,我没有再测试

3. 网上提到过一种方法,就是使用Interface来解决,有兴趣的可以研究研究:

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

我是试了半天,没有成功,就放弃了。

4. 顺便说一下 FindControl()

最常见也最让人头疼的就是 "Object reference not set to an instance of an object" 错误了。因为FindControl()需要从上往下逐级才能找到目标控件,特别是使用了master page的时候就更加麻烦。这个时候,需要使用如下的访问形式:

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