Załóżmy, że na stronie Master Page o nazwie Site.Master znajduje się kontrolka LabelMaster. Na podstawie strony master została utworzona strona z zawartością Content Page. Na tej stronie znajduje się przycisk ButtonStart.
W pewnych przypadkach, po kliknięciu przycisku ButtonStart, zawartość kontrolki LabelMaster ma zmienić wyświetlany tekst. Niestety ButtonStart i LabelMaster znajdują się na dwóch różnych stronach. Trzeba więc z poziomu strony z zwartością (Content) sięgnąć do kontrolki ze strony Master.
Żeby tego dokonać w Code Behind klasy strony master należy zdefiniować publiczną właściwość np. LabelMasterText, która pozwoli na odczyt i zapis tekstu znajdującego się w LabelMaster:
public string LabelMasterText { get { return LabelMaster.Text; } set{ LabelMaster.Text = value; } }Żeby strona z zawartością mogła odwoływać się do dodanej przed momentem właściwości, należy sprawić, żeby definicja strony master była „stronlgly typed”. Robi się to prosto: w kodzie strony z zawartością za dyrektywą Page należy dodać kolejną dyrektywę wskazującą w jakim pliku znajduje się strona master (dodajesz tyko to co jest zapisane boldem):
<%@ Page Title=”” Language=”C#” MasterPageFile=”~/Site.Master” AutoEventWireup=”true” CodeBehind=”OwnersList.aspx.cs” Inherits=”PiSMaker.Common.OwnersList” %> <%@ MasterType VirtualPath=”~/Site.Master” %>Teraz pozostaje już tylko oprogramować kliknięcie przycisku ButtonStart na stronie z contentem:
protected void Button2_Click(object sender, EventArgs e) { this.Master.LabelMasterText = „Akuku”; }Bez dodatkowej dyrektywy <%@ MasterType VirtualPath=”~/Site.Master” %> Intellisence nie podpowiadałby nowo zdefiniowanej właściwości LabelMasterText i projektu nie dałoby się skompilować.
Niestety rozwiązanie nie działa, jeżeli na stronie z zawartością (kontent page) użyłeś Ajax-owego UpdatePanel. UpdatePanel ma za zadanie podczas przeładowywania strony nie odtwarzać niczego innego niż zawartość UpdatePanel, nie odświeża więc także strony master. A w tym przypadku szkoda…
Uwaga!
Odwołanie do kontrolek znajdujących się na stronie master można realizować także bez definiowania dodatkowej właściwości i oraz dyrektywy MasterType! Można użyć konstrukcji:
protected void Button2_Click(object sender, EventArgs e) { Label lbl = Master.FindControl(„LabelMaster”) as Label; lbl. Text = „Akuku”; }Prawda, że prościej? Dzięki takiej konstrukcji zaoszczędzi się nieco pisania kodu, ale nie jest to zgodne z zasadami OOP. Jeżeli zmienisz nazwę kontrolki znajdującej się na stronie master kompilator nie zauważy tej zmiany (do nazwy odwołujesz się w tym przypadku poprzez tekst) i błąd pojawi się dopiero podczas wykonania.