有以下兩個頁面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"> //Default.aspx.cs public partial class _Default : System.Web.UI.Page |
<!-- 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 public partial class Result : System.Web.UI.Page |
這兩個頁面都指定了MasterPageFile屬性。因為該MasterPage中的內容無關緊要,就不列出來了。在Default.aspx上有兩個控件:TextBox1用于接受用戶的輸入,Button1用于提交頁面,其PostBackUrl指向Result.aspx。在Result.aspx.cs的Page_Load方法中嘗試在TextBox1中顯示用戶在前一頁面的TextBox1中輸入的字符串。當執行以下語句時:
TextBox tb = (TextBox)PreviousPage.FindControl("TextBox1");
tb的值為null。將以上語句更改為如下代碼:
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://odetocode.com/Blogs/scott/archive/2006/01/12/2726.aspx