Master Page and Content Page Interaction






4.63/5 (5 votes)
How to access Master page controls and routines from a content page and vice versa.
Introduction
In a MasterPage - ContentPage structure, it is often useful to be able to access controls in the Master page from code in the Content page and vice versa. Similarly, it can also be useful to access routines in one page from the other. We use Master pages a lot, and I regularly needed to do this type of interaction, and could never find the correct code snippet, so I finally decided to write them down properly.
Background
These interactions can be useful in a number of ways.
For example, on a Master page, you might have a Save button which saves the contents of the current Content page. However, prior to saving, you might need to validate that the data had been entered correctly. If you do this validation on the Master page and the structure of your Content pages differ, then you will end up with a large Select structure where you list all the possible Content page types and validate their data.
It is more modular to have the validation code in the Content page and call it from the Master page.
Using the code
Accessing Master page controls from a content page
Suppose there is a Label
on the Master page that we want to write to from the Content page.
- We must include a
MasterType
directive at the top of the Content page ASPX file: - We must include a public function in the Master page that returns a typed reference to the
Label
: - We can access the
Label
from the Content page using the Master syntax:
<%@ MasterType virtualpath="~/DetailsMaster.master" %>
Public Function LabelReference() As Label
' Create a reference to an actual label on the page
LabelReference = lblDetailsItemName
End Function
Master.LabelReference.Text = "Some Text"
Accessing Master page functions from a content page
If the MasterType
directive is in place in the Content page, then public functions in the Master page are available to the Content page code.
' Call the SavePageData function from the Master page
Master.SavePageData()
Accessing Content page controls from a Master page
Suppose we have a Master page that contains a ContentPlaceHolder
called DetailsMaster_ContentPlaceHolder
. If the content page contains a TextBox
called txtPass
, we can declare a ContentPlaceHolder
object and use it to find a reference to the TextBox
.
Dim mpContentPlaceHolder As ContentPlaceHolder
' Get a reference to the contentPlaceHolder
mpContentPlaceHolder = _
CType(FindControl("DetailsMaster_ContentPlaceHolder"), _
ContentPlaceHolder)
' Use FindControl to get a reference to a TextBox
' in the ContentPage called txtPass and write to its Text property
CType(mpContentPlaceHolder.FindControl("txtPass"), _
TextBox).Text = "Text for the TextBox"
Accessing Content page functions from a Master page
We can use VB’s CallByName
function to call a function in the Content page. This will allow us to have, e.g., the validation function for a form stored within the form and thus have different validations for each form. Suppose we have functions in a Content page like:
' function that receives a string and returns a string
Public Function ValidateMe(ByVal strInput As String) As String
ValidateMe = "The input was: " + strInput
End Function
' function that receives an Integer and returns an Integer
Public Function SumMe(ByVal Input1 As Integer, _
ByVal Input2 As Integer) As Integer
SumMe = Input1 + Input2
End Function
Then, we can call them from the Master page by setting up wrapper functions that connect to the Content page object, and do the CallByName
.
Private Function CallContentPageStringFunction(ByVal FunctionName _
As String, ByVal aParamArray() As String) As String
Dim mpContentPlaceHolder As ContentPlaceHolder
mpContentPlaceHolder = _
CType(FindControl("DetailsMaster_ContentPlaceHolder"), _
ContentPlaceHolder)
CallContentPageStringFunction = CallByName(mpContentPlaceHolder.Page, _
FunctionName, vbMethod, aParamArray)
End Function
Private Function CallContentPageIntegerFunction(ByVal FunctionName _
As String, ByVal aParamArray() As String) As Integer
Dim mpContentPlaceHolder As ContentPlaceHolder
mpContentPlaceHolder = _
CType(FindControl("DetailsMaster_ContentPlaceHolder"), _
ContentPlaceHolder)
CallContentPageIntegerFunction = CallByName(mpContentPlaceHolder.Page, _
FunctionName, vbMethod, aParamArray)
End Function
Then, we can pass parameters and get the return value as shown here:
- Using strings:
- Using integers:
Dim aParams(0) As String
aParams(0) = "Stand Up and Fight"
Dim strReturnValue As String = _
CallContentPageStringFunction("ValidateMe", aParams)
The return value in this case will be "The input was: Stand Up and Fight".
ReDim aParams(1)
aParams(0) = 10
aParams(1) = 12
Dim intRet As Integer = _
CInt(CallContentPageIntegerFunction("SumMe", aParams))
The return value in this case will be 220.