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:
<%@ MasterType virtualpath="~/DetailsMaster.master" %>
- We must include a public function in the Master page that returns a typed reference to the
Label
:
Public Function LabelReference() As Label
LabelReference = lblDetailsItemName
End Function
- We can access the
Label
from the Content page using the Master syntax:
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.
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
mpContentPlaceHolder = _
CType(FindControl("DetailsMaster_ContentPlaceHolder"), _
ContentPlaceHolder)
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:
Public Function ValidateMe(ByVal strInput As String) As String
ValidateMe = "The input was: " + strInput
End Function
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:
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".
- Using integers:
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.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.