有以下两个页面Default.aspx和Result.aspx,代码如下:
!-- Default.aspx --
%@ Page Language="C#" AutoEventWireup="true" MasterPageFile="~/Default.master" CodeFile="Default.aspx.cs" Inherits="_Default" %
asp:Content ID="Content1" runat="server" ContentPlaceHolderID="ContentPlaceHolder1"
asp:Label ID="Label1" runat="server" Text="Please input a string here"/asp:Label
asp:TextBox ID="TextBox1" runat="server"/asp:TextBox
asp:Button ID="Button1" runat="server" Text="Button" PostBackUrl="~/Result.aspx" //asp:Content
//Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
//using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
!-- Result.aspx --
%@ Page Language="C#" MasterPageFile="~/Default.master" AutoEventWireup="true" CodeFile="Result.aspx.cs" Inherits="Result" Title="Untitled Page" %
asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"
asp:Label ID="Label1" runat="server" Text="The string you input in the previous page is"/asp:Label
asp:TextBox ID="TextBox1" runat="server"/asp:TextBox
/asp:Content
//Result.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Result : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (PreviousPage != null)
{
TextBox tb = (TextBox)PreviousPage.FindControl("TextBox1");
if (tb != null)
TextBox1.Text = tb.Text;
}
}
}
这两个页面都指定了MasterPageFile属性。因为该MasterPage中的内容无关紧要,就不列出来了。在Default.aspx上有两个控件:TextBox1用于接受用户的输入,Button1用于提交页面,其PostBackUrl指向Result.aspx。在Result.aspx.cs的Page_Load方法中尝试在TextBox1中显示用户在前一页面的TextBox1中输入的字符串。当执行以下语句时:
TextBox tb = (TextBox)PreviousPage.FindControl("TextBox1");
tb的值为null。将以上语句更改为如下代码:
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/) Content con = (Content)PreviousPage.FindControl("Content1");
if (con == null)
return;
TextBox tb = (TextBox)con.FindControl("TextBox1");
但con的值为null,这样后续的语句也不可能执行了。问题出在哪里呢?
经过一番搜索,在forums.asp.net中找到了答案,以下引用的是bitmask的说法:
...becasue the Content controls themselves dissapear after the master page rearranges the page. You can use the ContentPlaceHolders, or the form on the MasterPage if there are no INamingContainers between the form and the control you need.
所以以上的代码应该改成:
TextBox tb = (TextBox)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("TextBox1");
bitmask还在他的博客上写了一篇文章来阐述FindControl方法和INamingContainers接口:
http://www.odetocode.com/Articles/116.aspx
http://movingboy.cnblogs.com/archive/2006/07/06/444690.html