这几天做项目,用到server.transfer来将上页内容传到下页,出了点小问题,请教老师,上网查,看SDK,搞了好久,才搞掂,发现有学到不少东西,下面把我遇到的情况和解决办法细细讲来。
1server.transfer用法:server.transfer用来重定向网页,它与Response.Rediret有所不同。server.transfer重定向是在服务器端传递,浏览器的地址栏不会显示变化。源页面的Cs文件中可写属性,目的也中可以引用,另外,目的页还可以捕获源页面的控件。
具体用法:在源页面a.aspx,目标页b.aspx
a.aspx.cs中有如下代码:
public string Cstatus
{
get
{
return DdlCstatus.SelectedValue.Trim();
}
}
b.aspx中注册a页面:
<%@ PreviousPageType VirtualPath ="a.aspx" %>
完成以上步骤,就可在b.aspx.cs中调用a.aspx.cs的属性,也可用findcontrol来获取a页控件
b.aspx.cs中代码:
LbPCid.Text = this.PreviousPage.Cid;
ListBox LbxPCdetaillist = this.PreviousPage.FindControl("LbxCdetaillist") as ListBox;
2带有母版页面的控件捕获:我用上述方法成功获取了a中属性Cid,可是ListBox控件始终返回Null.Debug了好几遍,又找其他控件,同样找不到,最后查SDk发现,原来是我用的母版页Master在作怪。
内容页的所有内容,控件,在编译时都存在母版页Master 的一个控件ContentPlaceHolder中,所以内容页中的Id放到母版页后会变化。也就是说,ContentPlaceHolder是母版页的一个容器,内容页的控件放在该容器中。
FindControl方法只能捕获当前对象中的控件,不能递归捕获,所以我们应先在母版中捕获ContentPlaceHolder,再在ContentPlaceHolder中捕获相应控件,代码修改如下:
ContentPlaceHolder cph = this.PreviousPage.Master.FindControl("ContentPlaceHolder1") as ContentPlaceHolder;
ListBox LbxPCdetaillist = cph.FindControl("LbxCdetaillist") as ListBox;
这样经过两次FindControl终于得到了ListBox控件。
以上内容希望能对用Master和Server.Transfer的朋友有一些帮助。