ASP.NET
How to: Reference ASP.NET Master Page Content

You can write code in content pages that references properties, methods, and controls in the master page, with some restrictions. The rule for properties and methods is that you can reference them if they are declared as public members of the master page. This includes public properties and public methods. You can reference controls on the master page independently of referencing public members.

To reference a public member on the master page

  1. Add a @ MasterType directive in the content page. In the directive, set the VirtualPath attribute to the location of the master page, as in this example:

    <%@ MasterType virtualpath="~/Masters/Master1.master" %>
    

    This directive causes the content page's Master property to be strongly typed.

  2. Write code that uses the master page's public member as a member of the Master property, as in this example, which assigns the value of a public property named CompanyName from the master page to a text box on the content page:

    Visual Basic
    CompanyName.Text = Master.CompanyName
    

    C#
    CompanyName.Text = Master.CompanyName;
    

To reference a control on the master page

  • Use the FindControl method, using the value returned by the Master property as the naming container.

    The following code example shows how to use the FindControl method to get a reference to two controls on the master page, a TextBox control and a Label control. Because the TextBox control is inside a ContentPlaceHolder control, you must first get a reference to the ContentPlaceHolder and then use its FindControl method to locate the TextBox control.

    Visual Basic
    Sub Page_Load()
        Dim mpContentPlaceHolder As ContentPlaceHolder
        Dim mpTextBox As TextBox
        mpContentPlaceHolder = _
            CType(Master.FindControl("ContentPlaceHolder1"), _
            ContentPlaceHolder)
        If Not mpContentPlaceHolder Is Nothing Then
            mpTextBox = CType(mpContentPlaceHolder. _
                FindControl("TextBox1"), TextBox)
            If Not mpTextBox Is Nothing Then
                mpTextBox.Text = "TextBox found!"
            End If
        End If
    
        ' Gets a reference to a Label control not in a 
        ' ContentPlaceHolder
        Dim mpLabel As Label
        mpLabel = CType(Master.FindControl("masterPageLabel"), Label)
        If Not mpLabel Is Nothing Then
            Label1.Text = "Master page label = " + mpLabel.Text
        End If
    End Sub
    

    C#
    void Page_Load()
    {
        // Gets a reference to a TextBox control inside 
        // a ContentPlaceHolder
        ContentPlaceHolder mpContentPlaceHolder;
        TextBox mpTextBox;
        mpContentPlaceHolder = 
          (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");
        if(mpContentPlaceHolder != null)
        {
            mpTextBox = 
                (TextBox) mpContentPlaceHolder.FindControl("TextBox1");
            if(mpTextBox != null)
            {
                mpTextBox.Text = "TextBox found!";
            }
        }
        
        // Gets a reference to a Label control that not in 
        // a ContentPlaceHolder
        Label mpLabel = (Label) Master.FindControl("masterPageLabel");
        if(mpLabel != null)
        {
            Label1.Text = "Master page label = " + mpLabel.Text;
        }
    }
See Also

Concepts

Other Resources

Tags :


Community Content

TJ_at_ITJ
An Easier Way

Add properties, methods to your master page or make controls public.

Cast the Master to your MasterPage. Then access your controls without having to use FindControl(...).

...
protectedvoid Page_Load(object sender, EventArgs e)
{
MyMasterPage mb = Master;
mb.MyTextBox.Text = "My Text";
}
Tags :

Madhu Bh
The easiest way
I think TJ_at_ITJ was wrong. THe correct solution:
Run this on a child page:

SiteMasterPage mp;

mp = (SiteMasterPage)Master;

mp.PageTitle = "Some Title";



and this should be on a master page:
public string PageTitle
{
get
{
return hdtitle.InnerText;
}
set
{
hdtitle.InnerText = value;
}
}


This is because by default all items are protected so you dont have any permission to access them from child page.
Hope this helps somebody.

David DeLella
Even better

In Visual Studio 2008 you actually need to set the reference to a New instance of the master page before assigning it to the casted Master otherwise you will get a ArgumentNullException. Here is the proper way to create a private variable for the content page which can be used to access public properties and methods on the master page:

Partial Class myClass
    Inherits System.Web.UI.Page
 
    Private myMasterPage As New TheMasterPage
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load
        myMasterPage = CType(Master, TheMasterPage)
        If Not Page.IsPostBack Then
            myMasterPage.Title = "Set Title Label To This Value"
        End If
    End Sub
End Class
Tags : masterpage

Page view tracker