ASP C# Jak z poziomu Content Page zmodyfikować zawartość kontrolki ze strony Master Page

23-Sty-2011

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.

Dodaj komentarz:

Autor: Rafał Kraik