다음을 통해 공유


ASP.NET 마스터 페이지에서 프로그래밍 방식으로 작업

업데이트: 2007년 11월

마스터 페이지에서 다음과 같이 일반적인 여러 가지 작업을 프로그래밍 방식으로 수행할 수 있습니다.

  • 마스터 페이지에 정의된 멤버에 액세스할 수 있습니다. 이러한 멤버는 공용 속성과 메서드 또는 컨트롤로 구성될 수 있습니다.

  • 콘텐츠 페이지에 마스터 페이지를 동적으로 연결할 수 있습니다.

마스터 페이지의 멤버에 액세스

마스터 페이지의 멤버에 대한 액세스 권한을 제공하기 위해 Page 클래스는 Master 속성을 노출합니다. 콘텐츠 페이지에서 특정 마스터 페이지의 멤버에 액세스하려면 @ MasterType 지시문을 만들어 마스터 페이지에 대한 강력한 형식의 참조를 만들 수 있습니다. 이 지시문을 사용하여 특정 마스터 페이지를 지정할 수 있습니다. 페이지에서 자체적으로 Master 속성을 만드는 경우 해당 속성은 참조되는 마스터 페이지로 형식화됩니다.

예를 들어, 클래스 이름이 MasterPage_master인 마스터 페이지 MasterPage.master가 있는 경우 다음과 같은 @ Page 및 @ MasterType 지시문을 만들 수 있습니다.

<%@ Page  masterPageFile="~/MasterPage.master"%>

<%@ MasterType  virtualPath="~/MasterPage.master"%>

위 예제와 같이 @ MasterType 지시문을 사용하면 다음 예제에서처럼 마스터 페이지의 멤버를 참조할 수 있습니다.

CompanyName.Text = Master.CompanyName
CompanyName.Text = Master.CompanyName;

페이지의 Master 속성은 이미 MasterPage_master로 형식화되어 있습니다.

마스터 페이지의 컨트롤 값 가져오기

런타임에 마스터 페이지는 콘텐츠 페이지와 병합되므로 콘텐츠 페이지 코드에서 마스터 페이지의 컨트롤에 액세스할 수 있습니다. 마스터 페이지의 ContentPlaceHolder 컨트롤에 컨트롤이 들어 있으면 이러한 컨트롤은 콘텐츠 페이지의 Content 컨트롤에 의해 재정의될 경우 액세스할 수 없게 됩니다. 이러한 컨트롤은 보호되어 있으므로 마스터 페이지의 멤버로 직접 액세스할 수 없습니다. 그러나 FindControl 메서드를 사용하면 마스터 페이지의 특정 컨트롤을 찾을 수 있습니다. 액세스할 컨트롤이 마스터 페이지의 ContentPlaceHolder 컨트롤 내에 있으면 먼저 ContentPlaceHolder 컨트롤에 대한 참조를 가져온 다음 FindControl 메서드를 호출하여 해당 컨트롤에 대한 참조를 가져와야 합니다.

다음 예제에서는 마스터 페이지의 컨트롤에 대한 참조를 가져오는 방법을 보여 줍니다. 참조되는 컨트롤 중 하나는 ContentPlaceHolder 컨트롤 내에 있고 다른 컨트롤은 외부에 있습니다.

' Gets a reference to a TextBox control inside a ContentPlaceHolder
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 that is not in a 
' ContentPlaceHolder control
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
// 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 is not in a 
// ContentPlaceHolder control
Label mpLabel = (Label) Master.FindControl("masterPageLabel");
if(mpLabel != null)
{
    Label1.Text = "Master page label = " + mpLabel.Text;
}

위 예제와 같이 FindControl 메서드를 사용하여 마스터 페이지의 ContentPlaceHolder 컨트롤 콘텐츠에 액세스할 수 있습니다. ContentPlaceHolder 컨트롤이 Content 컨트롤의 콘텐츠와 병합된 경우 ContentPlaceHolder 컨트롤에는 기본 콘텐츠가 포함되지 않습니다. 대신 콘텐츠 페이지에 정의된 텍스트와 컨트롤이 포함됩니다.

동적으로 마스터 페이지 연결

@ Page 지시문이나 구성 파일에서 마스터 페이지를 선언적으로 지정할 수 있을 뿐 아니라 마스터 페이지를 콘텐츠 페이지에 동적으로 연결할 수도 있습니다. 마스터 페이지와 콘텐츠 페이지는 페이지 처리의 초기화 단계에서 병합되므로 그 전에 마스터 페이지를 지정해야 합니다. 일반적으로는 다음 예제처럼 PreInit 단계에서 마스터 페이지를 동적으로 지정합니다.

Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) _
        Handles Me.PreInit
    Me.MasterPageFile = "~/NewMaster.master"
End Sub
void Page_PreInit(Object sender, EventArgs e)
{    this.MasterPageFile = "~/NewMaster.master";
}

동적 마스터 페이지에 강력한 형식 지정

콘텐츠 페이지에서 @ MasterType 지시문을 사용하여 마스터 페이지에 강력한 형식을 지정하는 경우 해당 형식은 사용자가 동적으로 지정한 모든 마스터 페이지에 적용되어야 합니다. 마스터 페이지를 동적으로 선택하려면 마스터 페이지를 파생시키는 기본 클래스를 만드는 것이 좋습니다. 그러면 기본 마스터 페이지 클래스에서 마스터 페이지에 공통적인 속성과 메서드를 정의할 수 있습니다. @ MasterType 지시문을 사용하여 마스터 페이지에 강력한 형식을 지정할 때 콘텐츠 페이지에서는 개별 마스터 페이지 대신 기본 클래스에 해당 형식을 지정할 수 있습니다.

다음 예제에서는 여러 마스터 페이지에서 사용할 수 있는 기본 마스터 페이지 형식을 만드는 방법을 보여 줍니다. 이 예제는 MasterPage 컨트롤에서 파생된 기본 형식, 기본 형식에서 상속하는 두 개의 마스터 페이지 및 사용자가 쿼리 문자열(?color=green)을 사용하여 마스터 페이지를 동적으로 선택할 수 있도록 하는 콘텐츠 페이지로 구성됩니다. 기본 마스터 형식은 MyTitle이라는 속성을 정의합니다. 마스터 페이지 중 하나는 MyTitle 속성을 재정의하지만 다른 하나는 그렇지 않습니다. 콘텐츠 페이지에서 MyTitle 속성은 페이지의 제목으로 표시됩니다. 따라서 페이지의 제목은 선택한 마스터 페이지에 따라 달라집니다.

다음은 기본 마스터 페이지 형식입니다. 이는 App_Code 디렉터리에 속해 있습니다.

Public Class BaseMaster
    Inherits MasterPage
    Public Overridable ReadOnly Property MyTitle() As String
        Get
            Return "BaseMaster Title"
        End Get
    End Property
End Class
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public class BaseMaster : System.Web.UI.MasterPage
{
    public virtual String MyTitle
    {
        get { return "BaseMaster Title"; }
    }
}

다음은 파란색 배경이 표시되는 첫 번째 마스터 페이지입니다. @ Master 지시문의 Inherits 특성은 기본 형식을 참조합니다.

<%@ Master Language="VB"  Inherits="BaseMaster" 
    ClassName="MasterBlue" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script >
    ' No property here that overrrides the MyTitle property of the base master.
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>No title</title>
</head>
<body>
    <form id="form1" >
    <div style="background-color:LightBlue">
        <asp:contentplaceholder id="ContentPlaceHolder1" 
            >
        Content from MasterBlue.
        </asp:contentplaceholder>
    </div>
    </form>
</body>
</html>
<%@ Master Language="C#" Inherits="BaseMaster" 
    ClassName="MasterBlue" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script >
    // No property here that overrrides the MyTitle property of the base master.
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" >
    <title>No title</title>
</head>
<body>
    <form id="form1" >
    <div style="background-color:LightBlue">
        <asp:contentplaceholder id="ContentPlaceHolder1" 
            >
        Content from MasterBlue.
        </asp:contentplaceholder>
    </div>
    </form>
</body>
</html>

다음은 두 번째 마스터 페이지입니다. 이 페이지는 녹색 배경이 표시된다는 점만 제외하고 첫 번째 마스터 페이지와 동일하며 기본 형식에 정의된 MyTitle 속성을 재정의합니다.

<%@ Master Language="VB" Inherits="BaseMaster" 
    ClassName="MasterGreen" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<script >
    Public Overrides ReadOnly Property MyTitle() As String
        Get
            Return "MasterGreen Title"
        End Get
    End Property
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >   
    <title>No title</title>
</head>
<body>
    <form id="form1" >
    <div style="background-color:LightGreen">
        <asp:contentplaceholder id="ContentPlaceHolder1" >
            Content from MasterGreen.
        </asp:contentplaceholder>
    </div>
    </form>
</body>
</html>
<%@ Master Language="C#" Inherits="BaseMaster" 
    ClassName="MasterGreen" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<script >
    public override String MyTitle
    { 
        get { return "MasterGreen Title"; } 
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" >   
    <title>No title</title>
</head>
<body>
    <form id="form1" >
    <div style="background-color:LightGreen">
        <asp:contentplaceholder id="ContentPlaceHolder1" 
            >
            Content from MasterGreen.
        </asp:contentplaceholder>
    </div>
    </form>
</body>
</html>

다음은 사용자가 요청과 함께 제공된 쿼리 문자열을 기준으로 한 마스터 페이지를 선택할 수 있도록 하는 콘텐츠 페이지입니다. 페이지의 Master 속성에 강력한 형식을 지정하는 @ MasterType 지시문은 기본 형식을 참조합니다.

<%@ Page Language="VB" Title="Content Page" MasterPageFile="~/MasterBlue.master"%>
<%@ MasterType TypeName="BaseMaster" %>
<script >
    
    Protected Sub Page_PreInit(ByVal sender As Object, 
            ByVal e As System.EventArgs)
        Me.MasterPageFile = "MasterBlue.master"
        If Request.QueryString("color") = "green" Then
            Me.MasterPageFile = "MasterGreen.master"
        End If
        Me.Title = Master.MyTitle
    End Sub
</script>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    Content from Content page.
</asp:Content>
<%@ Page Language="C#" Title="Content Page" MasterPageFile="~/MasterBlue.master"%>
<%@ MasterType TypeName="BaseMaster" %>
<script >
    protected void Page_PreInit(Object sender, EventArgs e)
    {
        this.MasterPageFile = "MasterBlue.master";
        if(Request.QueryString["color"] == "green")
        {
            this.MasterPageFile = "MasterGreen.master";
        }
        this.Title = Master.MyTitle;
    }
</script>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" 
        Runat="Server">
    Content from Content page.
</asp:Content>

참고 항목

개념

ASP.NET 마스터 페이지 개요