달력

32024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

ASP.NET 2.0의 마스터 페이지

Stephen Walther
Superexpert

2004년 8월

적용 대상:
   Microsoft ASP.NET 2.0

요약: 마스터 페이지에서는 일관된 주제와 스타일을 따르는 ASP.NET 페이지를 만들 수 있습니다. Stephen Walther기 이 새로운 기능을 활용하는 방법을 설명합니다(27페이지/인쇄 페이지 기준).

목차

소개
마스터 페이지 및 콘텐츠 페이지
간단한 마스터 페이지 만들기
간단한 콘텐츠 페이지 만들기
사이트 탐색 기능이 있는 마스터 페이지 만들기
여러 마스터 페이지 중첩
마스터 페이지 구성
마스터 페이지 속성 재정의
페이지 제목 특성 사용
HTML 헤더 특성 재정의
마스터 페이지에서 속성 및 메서드 제공
동적으로 마스터 페이지 로드
결론
관련 서적

소개

Microsoft ASP.NET 2.0의 새 기능인 마스터 페이지를 사용하면 웹 응용 프로그램에서 같은 페이지 레이아웃을 여러 콘텐츠 페이지에 적용할 수 있습니다. 또한 일관성 있는 모양과 느낌의 웹 사이트를 만드는 것이 쉬워집니다(이 기사에는 영문 페이지 링크가 포함되어 있습니다).

대부분의 웹 응용 프로그램 페이지에는 로고, 탐색 메뉴, 저작권 표시 등의 표준 요소가 있습니다. 이러한 모든 요소를 단일 마스터 페이지에 배치할 수 있습니다. 이 마스터 페이지를 기반으로 하여 응용 프로그램 콘텐츠 페이지를 만들면 모든 콘텐츠 페이지에 동일한 표준 요소가 자동으로 포함됩니다.

이 기사에서는 마스터 페이지를 활용하여 표준 페이지 레이아웃을 만드는 방법을 알아봅니다. 또한 마스터 페이지의 몇 가지 고급 기능에 대해서도 살펴봅니다. 예를 들어 콘텐츠 페이지에서 페이지 제목 및 메타 태그와 같은 헤더 속성을 수정하는 방법을 설명하고, 실행 중에 여러 마스터 페이지를 동적으로 로드하는 방법도 설명합니다.

마스터 페이지 및 콘텐츠 페이지

먼저, 간단한 마스터 페이지를 만들어 보겠습니다. 메모장을 사용하여 마스터 페이지를 만들 수도 있고 Microsoft Visual Web Developer의 디자이너 지원 기능을 활용하여 마스터 페이지를 만들 수도 있습니다(그림 1 참조). Visual Web Developer를 사용하여 마스터 페이지를 만드는 것이 더 재미있지만, 이 기사에서는 Visual Web Developer를 사용하지 않습니다.

그림 1. 마스터 페이지에 대한 디자이너 지원

간단한 마스터 페이지 만들기

일반 ASP.NET 페이지를 만드는 것과 같은 방법으로 마스터 페이지를 만듭니다. 마스터 페이지에는 표준 ASP.NET 페이지에 추가하는 것과 동일한 Web 컨트롤, User 컨트롤, HTML 콘텐츠 및 스크립트를 포함할 수 있습니다. 그러나 마스터 페이지와 일반 ASP.NET 페이지 간에는 세 가지의 중요한 차이점이 있습니다.

첫째로, 일반 ASP.NET 페이지와 달리 마스터 페이지의 이름은 특수한 확장명인 .master로 끝나야 합니다. 이 확장명은 해당 페이지가 마스터 페이지임을 나타냅니다. 또한 ASP.NET 응용 프로그램은 확장명이 .master인 페이지를 요청할 수 없도록 구성되므로 마스터 페이지를 직접 요청할 수 없습니다. 대신, 마스터 페이지를 기반으로 하는 콘텐츠 페이지를 요청합니다.

둘째로, 마스터 페이지에는 일반 <%@ Page %> 지시문 대신 <%@ Master %> 지시문이 포함됩니다. <%@ Master %> 지시문은 <%@ Page %> 지시문과 동일한 특성을 대부분 지원합니다. 예를 들어 <%@ Master Language="vb" %> 지시문을 사용하여 페이지의 프로그래밍 언어를 지정할 수 있습니다.

마스터 페이지와 일반 ASP.NET 페이지 간의 세 번째 차이점은 마스터 페이지에 ContentPlaceHolder 컨트롤을 포함하지 않을 수도 있고 여러 개 포함할 수도 있다는 점입니다. 마스터 페이지에서만 ContentPlaceHolder 컨트롤을 사용할 수 있습니다. 이 컨트롤은 특정 콘텐츠 페이지에서 재지정할 수 있는 마스터 페이지의 영역을 표시합니다.

목록 1의 마스터 페이지 Simple.master에는 두 개의 ContentPlaceHolder 컨트롤이 있는 HTML 테이블이 포함되어 있습니다.

목록 1. Simple.master

<%@ Master %><html><head>    <title>Simple Master Page</title></head><body><form id="form1" runat="server"><table width="100%"><tr>    <td>    <asp:ContentPlaceHolder         id="ContentPlaceHolder1"         runat="server"  />    </td>    <td>    <asp:ContentPlaceHolder         id="ContentPlaceHolder2"         runat="server"  />    </td></tr></table></form></body></html>

목록 1의 마스터 페이지에는 ContentPlaceHolder1ContentPlaceHolder2의 두 ContentPlaceHolder 컨트롤이 있습니다. 이 두 컨트롤은 특정 콘텐츠 페이지의 경우에 수정할 수 있는 마스터 페이지의 영역을 표시합니다. Visual Web Developer 디자이너에서 목록 1의 마스터 페이지를 열면 그림 2의 페이지가 나타납니다.

그림 2. Simple.master 마스터 페이지

목록 1의 마스터 페이지에는 표준 HTML 여는 태그가 포함되어 있습니다. 예를 들어 여기에는 HTML <title> 및 <body> 태그가 있습니다. 일반적으로 이러한 표준 태그를 마스터 페이지에 포함합니다. 이 기사의 뒷부분에 있는 "마스터 페이지 속성 재정의" 섹션에서 특정 콘텐츠 페이지의 제목을 변경하는 방법을 설명하겠습니다.

마스터 페이지에는 서버 쪽 <form> 태그도 포함되어 있습니다. ASP.NET 페이지에서는 서버 쪽 <form> 태그를 하나만 사용할 수 있으므로, 대부분의 경우 이 태그를 마스터 페이지에 포함합니다.

간단한 콘텐츠 페이지 만들기

마스터 페이지를 만든 후에는 이 마스터 페이지를 기반으로 하나 이상의 콘텐츠 페이지를 만들 수 있습니다. 콘텐츠 페이지는 웹 브라우저에서 요청하는 실제 페이지입니다. 콘텐츠 페이지의 확장명은 일반 ASP.NET 파일과 같은 .aspx입니다. 다음의 두 가지 주요 예외를 제외하면 콘텐츠 페이지는 일반 ASP.NET와 유사합니다.

첫째로, 콘텐츠 페이지의 모든 콘텐츠는 Content 컨트롤에 포함해야 합니다. Content 컨트롤은 콘텐츠 페이지의 콘텐츠 영역을 마스터 페이지에서 ContentPlaceHolder 컨트롤이 표시한 콘텐츠 영역에 매핑하는 데 사용됩니다.

둘째로, 콘텐츠 페이지를 마스터 페이지에 연결해야 합니다. <%@ Page %> 지시문의 특성을 사용하여 콘텐츠 페이지를 마스터 페이지에 연결할 수 있습니다. 웹 구성 파일을 사용하여 여러 콘텐츠 페이지를 마스터 페이지에 연결할 수도 있습니다.

예를 들어 목록 2의 콘텐츠 페이지에 있는 두 개의 Content 컨트롤은 목록 1의 마스터 페이지에 있는 ContentPlaceHolder 컨트롤에 해당합니다.

목록 2. Simple.aspx

<%@ Page MasterPageFile="~/Simple.master" %><asp:Content     ID="Content1"     ContentPlaceHolderID="ContentPlaceHolder1"     Runat="server">    Content in Left Column</asp:Content><asp:Content     ID="Content2"     ContentPlaceHolderID="ContentPlaceHolder2"     Runat="server">    Content in Right Column</asp:Content>

목록 2에 있는 콘텐츠 페이지의 <%@ Page %> 지시문에는 MasterPageFile 특성이 포함되어 있습니다. 이 특성은 콘텐츠 페이지를 목록 1의 마스터 페이지에 연결합니다.

Content 컨트롤에는 모두 여는 태그와 닫는 태그 사이에 텍스트가 있습니다. 이러한 경우 Content 컨트롤에는 단순히 텍스트만 포함됩니다. 그러나 Web 컨트롤 및 User 컨트롤을 비롯하여 Content 컨트롤 내에 원하는 콘텐츠를 얼마든지 추가할 수 있습니다.

Visual Web Developer에서 콘텐츠 페이지를 편집하면 다른 작업 중에 마스터 페이지가 복제됩니다(그림 3 참조). Visual Web Developer는 마스터 페이지에서 각 ContentPlaceHolder에 해당하는 Content 컨트롤을 자동으로 추가합니다.

그림 3. Visual Web Developer에서 콘텐츠 페이지 편집

사이트 탐색 기능이 있는 마스터 페이지 만들기

이전 섹션에서 설명한 마스터 페이지와 콘텐츠 페이지는 매우 단순합니다. 실제로는 메뉴 모음이나 사이트 이동 경로(bread crumb trail)와 같은 표준 탐색 요소를 마스터 페이지에 추가할 수 있습니다. 이 섹션에서는 보다 많은 내용이 들어 있는 마스터 페이지를 만드는 과정을 살펴봅니다(그림 4 참조).

그림 4. 보다 복잡한 마스터 페이지

이 마스터 페이지에는 SiteMapPath 컨트롤 및 탐색용 Menu 컨트롤이 포함됩니다. SiteMapPath 컨트롤은 사이트 이동 경로(bread crumb trail)를 표시하고 Menu 컨트롤은 탐색 메뉴를 표시합니다. 두 컨트롤 모두 목록 3의 SiteMap 파일을 사용합니다.

목록 3. web.sitemap

<?xml version="1.0" encoding="utf-8"?><siteMap>    <siteMapNode url="~/Default.aspx" title="Home">   <siteMapNode url="~/Products.aspx" title="Products"/>   <siteMapNode url="~/Services.aspx" title="Services"/>    </siteMapNode></siteMap>

목록 3의 SiteMap 파일은 Home 페이지, Products 페이지 및 Services 페이지의 세 노드를 정의합니다. 각 노드에는 URL 및 제목 특성이 지정되어 있습니다. 목록 4의 마스터 페이지에서는 SiteMapPathMenu 컨트롤에 이 파일을 활용합니다.

목록 4. NavMaster.master

<%@ Master %><html><head>    <title>NavMaster</title></head><body>    <form id="form1" runat="server">        <table             width="100%"            border="0"            cellpadding="5">        <tr>            <td colspan="2">            <asp:Image                 id="Image1"                ImageUrl="~/Logo.gif" Runat="Server" />            </td>        </tr>        <tr bgcolor="lightblue">            <td colspan="2">            <asp:SiteMapPath                 id="SiteMapPath1"                 Runat="Server" />                         </td>        </tr>        </table>        <table width="100%" cellpadding="10" border="0">        <tr>            <td valign="top" width="100" bgcolor="#eeeeee">            <asp:Menu                 id="Menu"                 Runat="Server"                 DataSourceID="SiteMapDataSource1"                 StaticDisplayLevels="2" />            </td>            <td valign="top">            <asp:contentplaceholder                 id="ContentColumn"                 runat="server"  />            </td>            <td valign="top" width="100" bgcolor="#eeeeee">            <asp:ContentPlaceHolder                 id="AdColumn"                 runat="server" >                <asp:Image                    ID="Ad1"                     ImageUrl="Ad1.gif"                    Runat="Server" />                <br />                <asp:Image                    ID="Ad2"                      ImageUrl="Ad2.gif"                    Runat="Server" />            </asp:ContentPlaceHolder>            </td>        </tr>        </table>        <small>All contents copyright ⓒ   2004 by Microsoft Hair Stylists</small>        <asp:SiteMapDataSource ID="SiteMapDataSource1"   Runat="server" />    </form></body></html>

목록 4의 마스터 페이지에는 두 개의 ContentPlaceHolder 컨트롤이 포함되어 있습니다. 첫 번째 ContentPlaceHolder 컨트롤은 주 페이지 콘텐츠의 자리 표시자로 사용되며 두 번째 ContentPlaceHolder 컨트롤은 콘텐츠를 광고하는 자리 표시자로 사용됩니다.

두 번째 ContentPlaceHolder 컨트롤에는 기본 콘텐츠가 포함됩니다. 여기에는 배너 광고를 표시하는 데 사용되는 Image 컨트롤이 포함됩니다(그림 5 참조). 특정 콘텐츠 페이지에서 이 기본 콘텐츠를 재정의할 수 있습니다.

그림 5. NavMaster.master 마스터 페이지

마지막으로, 목록 5의 콘텐츠 페이지는 NavMaster.master 마스터 페이지를 기반으로 합니다(그림 6 참조). 이 페이지에는 마스터 페이지의 주 콘텐츠 영역 콘텐츠가 들어 있는 Content 컨트롤이 한 개 있습니다.

그림 6. Products.aspx 페이지

목록 5. Products.aspx

<%@ Page MasterPageFile="~/NavMaster.master" %><asp:Content     ID="Content1"     ContentPlaceHolderID="ContentColumn"     Runat="server">    This is the Products.aspx page</asp:Content>

여러 마스터 페이지 중첩

지금까지 단일 마스터 페이지를 만들고 이 마스터 페이지를 기반으로 콘텐츠 페이지를 만드는 방법을 살펴보았습니다. 단일 웹 사이트에는 여러 마스터 페이지가 포함될 수 있습니다. 예를 들어 웹 사이트에서 뚜렷하게 구분되는 섹션에 대해 다른 마스터 페이지를 만들 수 있습니다.

필요한 경우에는 여러 마스터 페이지를 중첩할 수도 있습니다. 예를 들어 전체 웹 사이트의 마스터 페이지를 하나 만들고 이 사이트 마스터 페이지에 개별 섹션의 마스터 페이지를 중첩할 수 있습니다. Visual Web Developer에서는 이러한 작업을 위한 디자이너 지원을 제공하지 않습니다. 그러므로 마스터 페이지를 중첩하려면 소스 코드 보기에서 작업하거나 메모장을 사용하여 페이지를 만들어야 합니다.

예를 들어 목록 6의 페이지를 Site Master Page에 사용할 수 있습니다. 이 마스터 페이지에는 여는 HTML 태그 및 닫는 HTML 태그, Form 태그 및 단일 ContentPlaceHolder 컨트롤이 포함되어 있습니다.

목록 6. SiteMaster.master

<%@ Master %><html><head>    <title>Site Master</title></head><body bgcolor="LightGreen">    <form id="form1" runat="server">        <h1>Site Master Page</h1>        <asp:contentplaceholder             id="SiteContentPlaceHolder"             runat="server"  />    </form></body></html>

목록 7의 페이지는 중첩된 마스터 페이지입니다. 이 마스터 페이지는 Site Master Page의 콘텐츠를 재정의합니다. <%@ Master %> 지시문은 SiteMaster.master 마스터 페이지를 참조합니다.

목록 7. SectionMaster.master

<%@ Master  MasterPageFile="~/SiteMaster.master" %><asp:content    ContentPlaceHolderID="SiteContentPlaceHolder"     runat="server" >        <table width="100%" bgcolor="LightYellow">    <tr>        <td colspan="2">        <h1>Section Master Page</h1>        </td>    </tr>    <tr>        <td>        <asp:ContentPlaceHolder               id="LeftColumn"            Runat="Server" />                     </td>        <td>        <asp:ContentPlaceHolder               id="RightColumn"            Runat="Server" />             </td>    </tr>    </table>    </asp:content>

마지막으로, 목록 8의 콘텐츠 페이지는 Section Master Page를 기반으로 합니다. 이 페이지는 Section Master Page에 중첩된 두 ContentPlaceHolder 컨트롤을 재정의합니다.

목록 8. NestedMasters.aspx

<%@ Page MasterPageFile="~/SectionMaster.master" %><asp:Content        ContentPlaceHolderId="LeftColumn"    Runat="Server">    This content appears in the left column</asp:Content><asp:Content       ContentPlaceHolderId="RightColumn"    Runat="Server">    This content appears in the right column</asp:Content>

모든 작업을 수행하고 나면 그림 7의 페이지가 렌더링됩니다. Site Master Page 및 Site Master Page의 콘텐츠가 병합되어 최종 콘텐츠 페이지가 생성됩니다. Site Master Page의 콘텐츠는 녹색으로 표시되고 Section Master page의 콘텐츠는 노란색으로 표시됩니다.

그림 7. 중첩된 마스터 페이지

마스터 페이지 구성

<%@ Page %> 지시문을 사용하여 콘텐츠 페이지를 마스터 페이지에 연결하는 대신, 웹 응용 프로그램의 구성 파일에서 마스터 페이지를 콘텐츠 페이지에 연결할 수 있습니다. 구성 파일을 사용하면 한 위치에서 여러 콘텐츠 페이지에 연결된 마스터 페이지를 변경할 수 있기 때문에 규모가 큰 웹 사이트를 보다 쉽게 관리할 수 있습니다.

구성 파일의 <pages> 요소에서 마스터 페이지를 설정합니다. 이 요소는 구성 파일의 <system.web> 섹션에 나타납니다. 예를 들어 다음 <pages> 요소는 "SuperMaster.master"를 기본 마스터 페이지로 설정합니다.

<pages masterPageFile="SuperMaster.master" />

구성 파일에서 마스터 페이지를 할당할 때는 두 가지 사항을 알아 두어야 합니다. 첫째로, 콘텐츠 페이지에서 설정한 마스터 페이지가 구성 파일에서 설정한 마스터 페이지보다 우선합니다. 그러므로 Web.Config 파일을 사용하여 마스터 페이지를 설정하려면 콘텐츠 페이지에 MasterPageFile 특성을 포함하지 않아야 합니다.

둘째로, 응용 프로그램은 각각 다른 마스터 페이지를 설정하는 서로 다른 하위 폴더에 있는 Web.Config 파일 두 개 이상을 포함할 수 있습니다. 즉, 새 Web.Config 파일을 만들어 하위 폴더에 있는 Web.Config 파일에서 설정된 마스터 페이지를 재정의할 수 있습니다.

마스터 페이지 속성 재정의

마스터 페이지 작업을 시작한 직후에 발생할 수 있는 한 가지 문제점은 개별 콘텐츠 페이지에서 마스터 페이지의 페이지 제목 및 메타 태그와 같은 속성을 재정의하는 방법입니다. 일반적으로, 같은 마스터 페이지를 기반으로 개별 콘텐츠 페이지를 만들었더라도 각 콘텐츠 페이지마다 고유한 제목을 표시합니다.

특정 콘텐츠 페이지에서 마스터 페이지에 포함된 콘텐츠를 재정의하는 방법에는 여러 가지가 있습니다. 이 섹션에서는 이러한 방법에 대해 설명하겠습니다.

페이지 제목 특성 사용

마스터 페이지에서 렌더링된 페이지 제목을 콘텐츠 페이지에서 변경하기만 하려는 경우에는 <%@ Page %> 지시문의 Title 특성을 사용할 수 있습니다. 이 특성은 마스터 페이지에서 서버 쪽 HtmlHead 컨트롤을 사용할 때만 적용됩니다.

예를 들어 목록 9의 마스터 페이지에는 서버 쪽 HtmlHead 컨트롤이 포함되어 있습니다.

목록 9. TitleMaster.master

<%@ Master %><html><head runat="server">    <title>Master Title</title></head><body>    <form id="form1" runat="server">    <asp:contentplaceholder         id="ContentPlaceHolder1"         runat="server"  />    </form></body></html>

목록 9의 <head> 태그에는 runat="server" 특성이 있습니다. 이 특성은 <head> 태그를 서버 쪽 HtmlHead 컨트롤로 변환합니다.

목록 10의 콘텐츠 페이지는 페이지 제목을 재정의합니다. 이 페이지 맨 위에 있는 <%@ Page %> 지시문에는 해당 Title 특성 값이 있습니다. 페이지가 렌더링될 때 페이지 제목으로 "Content Page Title"이 표시됩니다.

목록 10. TitleContent.aspx

<%@ Page MasterPageFile="~/TitleMaster.master" Title="Content Page Title" %><asp:Content    ContentPlaceHolderID="ContentPlaceHolder1"    Runat="Server">        Here is some content    </asp:Content>

HTML 헤더 특성 재정의

메타 태그나 스타일 태그 등 HTML 헤더의 다른 특성을 재정의해야 하는 경우 콘텐츠 페이지에서 직접 HtmlHead 요소를 참조할 수 있습니다. HtmlHead 컨트롤은 IPageHeader 인터페이스를 구현합니다. 여기에는 다음 속성이 포함됩니다.

  • LinkedStyleSheets-HTML 페이지에 연결된 외부 스타일시트입니다.
  • Metadata-메타데이터 태그의 컬렉션입니다.
  • StyleSheet-HTML 페이지에 적용된 스타일을 나타냅니다.
  • Title-HTML 페이지의 제목입니다.

콘텐츠 페이지에서 이러한 속성을 수정할 수 있습니다. 예를 들어 목록 11의 마스터 페이지에는 콘텐츠 페이지에서 재정의할 수 있는 서버 쪽 HtmlHead 컨트롤이 있습니다.

목록 11. HeaderMaster.master

<%@ Master %><html><head runat="server">    <title>Master Title</title></head><body>    <form id="form1" runat="server">    <asp:contentplaceholder         id="ContentPlaceHolder1"         runat="server"  />    </form></body></html>

목록 12의 콘텐츠 페이지는 HtmlHead 컨트롤의 TitleMetadata 속성을 수정하여 사용자 지정 콘텐츠를 표시합니다.

목록 12. HeaderContent.aspx(Microsoft Visual Basic .NET)

<%@ Page Language="VB" MasterPageFile="~/HeaderMaster.master" %><script runat="server">    Sub Page_Load()        Master.Page.Header.Title = "Content Title"        Master.Page.Header.Metadata.Add("Keywords", "blah,blah")        Master.Page.Header.Metadata.Add("Description", "blah,blah")    End Sub    </script><asp:Content    ContentPlaceHolderID="ContentPlaceHolder1"    Runat="Server">        Here is some content        </asp:Content> 

목록 12. HeaderContent.aspx(c#)

<%@ Page Language="c#" MasterPageFile="~/HeaderMaster.master" %><script runat="server">    void Page_Load() {        Master.Page.Header.Title = "Content Title";        Master.Page.Header.Metadata.Add("Keywords", "blah,blah");        Master.Page.Header.Metadata.Add("Description", "blah,blah");    }    </script><asp:Content ID="Content1"    ContentPlaceHolderID="ContentPlaceHolder1"    Runat="Server">        Here is some content        </asp:Content>

Page 개체의 Master 속성은 콘텐츠 페이지의 마스터 페이지를 참조합니다. 원하는 경우에는 Master 대신 Page.Master를 사용할 수도 있습니다. Header 속성은 HtmlHead 요소를 참조합니다. 목록 12의 콘텐츠 페이지는 HtmlHead 컨트롤의 TitleMetadata 속성을 수정합니다.

마스터 페이지에서 속성 및 메서드 제공

마스터 페이지의 콘텐츠를 더 상세히 조정해야 할 경우 마스터 페이지에서 속성 및 메서드를 제공할 수 있습니다. 마스터 페이지에서 제공한 공용 속성을 콘텐츠 페이지에서 수정할 수 있으며, 마스터 페이지에서 제공한 공용 메서드를 콘텐츠 페이지에서 호출할 수 있습니다.

예를 들어 콘텐츠 페이지에서 마스터 페이지 바닥글의 콘텐츠를 수정할 수 있습니다. 목록 13의 마스터 페이지는 Footer라는 공용 속성을 제공합니다.

목록 13. FooterMaster.master(Visual Basic .NET)

<%@ Master Language="VB" %><script runat="server">    Private _footer As String        Public Property Footer() As String        Get            Return _footer        End Get        Set(ByVal value As String)            _footer = value        End Set    End Property    </script><html><head runat="server">    <title>Footer Master</title></head><body>    <form id="form1" runat="server">    <asp:contentplaceholder         id="ContentPlaceHolder1"         runat="server"  />    <br />    <small><%= _footer %></small>    </form></body></html>

목록 13. FooterMaster.master(C#)

<%@ Master Language="C#" %><script runat="server">    private string _footer;        public string Footer {        get {            return _footer;        }        set {            _footer = value;        }    }    </script><html><head id="Head1" runat="server">    <title>Footer Master</title></head><body>    <form id="form1" runat="server">    <asp:contentplaceholder         id="ContentPlaceHolder1"         runat="server"  />    <br />    <small><%= _footer %></small>    </form></body></html>

목록 13에서 공용 Footer 속성은 _footer라는 개인 필드를 수정합니다. 개인 _footer 필드는 인라인 식 <%= _footer %>를 사용하여 마스터 페이지의 맨 아래에 표시됩니다.

목록 14의 콘텐츠 페이지는 Footer 속성을 설정합니다. Footer 속성은 Page 개체의 Master 속성에 의해 제공됩니다. 일반적으로 Master 속성은 MasterPage 개체를 나타냅니다. 그러나 이 콘텐츠 페이지에는 Master 속성 값을 FooterMaster 개체로 캐스팅하는 <%@ MasterType %> 지시문이 포함됩니다.

목록 14. FooterContent.aspx(Visual Basic .NET)

<%@ Page Language="VB" MasterPageFile="~/FooterMaster.master" %><%@ MasterType VirtualPath="~/FooterMaster.master" %><script runat="server">    Sub Page_Load()        Master.Footer = "Custom Page Footer"    End Sub    </script><asp:Content    ContentPlaceHolderID="ContentPlaceHolder1"    Runat="Server">    Here is some content    </asp:Content>

목록 14. FooterContent.aspx(C#)

<%@ Page Language="C#" MasterPageFile="~/FooterMaster.master" %><%@ MasterType VirtualPath="~/FooterMaster.master" %><script runat="server">    void Page_Load() {        Master.Footer = "Custom Page Footer";    }    </script><asp:Content ID="Content1"    ContentPlaceHolderID="ContentPlaceHolder1"    Runat="Server">    Here is some content    </asp:Content>

마스터 페이지에서 속성과 메서드를 제공하여 마스터 페이지의 렌더링 관련 항목을 수정할 수 있습니다.

동적으로 마스터 페이지 로드

이 마지막 섹션에서는 마스터 페이지의 고급 응용 프로그램에 대해 살펴봅니다. 또한 실행 중에 여러 마스터 페이지를 동적으로 로드하는 방법도 설명합니다.

마스터 페이지를 동적으로 로드하는 것이 유용한 경우가 두 가지 있습니다. 우선, 사용자의 웹 사이트에서 하나 이상의 파트너 웹 사이트와 공동 상표를 사용해야 하는 경우가 있습니다. 파트너 구성원이 파트너 웹 사이트에서 사용자의 웹 사이트에 연결하는 경우 파트너 웹 사이트의 모양 및 느낌과 일치하는 마스터 페이지를 자동으로 로드할 수 있습니다.

마스터 페이지를 동적으로 로드하는 두 번째 경우는 응용 프로그램 사용자가 페이지 레이아웃을 선택할 수 있도록 하는 경우입니다. 이 경우 사용자에게 표준 마스터 페이지 집합을 제공할 수 있습니다. 그러면 응용 프로그램 사용자는 원하는 마스터 페이지를 선택하여 원하는 페이지 레이아웃을 선택할 수 있습니다.

Page 개체의 MasterPageFile 속성에 값을 할당하여 마스터 페이지를 동적으로 로드할 수 있습니다. 이 속성에 할당된 값은 유효한 마스터 페이지 파일의 상대 경로여야 합니다.

MasterPageFile 속성을 사용할 때 주의해야 할 중요한 제한 사항이 있습니다. Page PreInit 이벤트 전이나 이벤트 동안에만 이 속성에 값을 할당할 수 있습니다. PreInit는 페이지 실행 주기에서 첫 번째 이벤트입니다. Page Load 이벤트 등 나중에 발생하는 이벤트 동안 이 속성에 값을 할당하면 예외가 발생합니다. 마스터 페이지에 따라 서로 다른 컨트롤 집합이 페이지에 로드되기 때문입니다.

목록 15의 콘텐츠 페이지는 MasterPageFile 속성을 사용하여 실행 중에 서로 다른 마스터 페이지를 동적으로 로드합니다.

목록 15. DynamicContent.aspx(Visual Basic .NET)

<%@ Page Language="VB" MasterPageFile="~/DynamicMaster1.master" %><script runat="server">        Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs)        MasterPageFile = Profile.Master    End Sub</script><asp:Content    ContentPlaceHolderID="ContentPlaceHolder1"    Runat="Server">    Here is the content</asp:Content> 

목록 15. DynamicContent.aspx(C#)

<%@ Page Language="c#" MasterPageFile="~/DynamicMaster1.master" %><script runat="server">        void Page_PreInit(Object sender, EventArgs e) {        MasterPageFile = Profile.Master;    }</script><asp:Content ID="Content1"    ContentPlaceHolderID="ContentPlaceHolder1"    Runat="Server">    Here is the content</asp:Content>

목록 15에서 마스터 페이지는 PreInit 이벤트에서 동적으로 로드됩니다. 이 경우 마스터 페이지 파일의 경로는 사용자의 프로필에서 로드됩니다. 프로필을 사용하여 사용자와 관련된 정보를 영구적으로 저장할 수 있습니다. 이 방법을 사용하면 응용 프로그램에서 사용자가 페이지 간을 이동할 때 사용자가 선택한 마스터 페이지가 손실되지 않습니다.

사용자 프로필을 사용하려면 다음 구성 설정을 응용 프로그램 Web.Config 파일의 <system.web> 섹션에 추가해야 합니다.

<anonymousIdentification enabled="true" />      <profile> <properties>    <add    name="Master"     allowAnonymous="true"    defaultValue="DynamicMaster1.master" /> </properties> </profile>

이 설정은 익명 사용자와 인증된 사용자가 모두 사용할 수 있는 Master라는 새 Profile 속성을 만듭니다.

목록 15의 콘텐츠 페이지는 DynamicMaster1.master와 DynamicMaster2.master라는 두 마스터 페이지 중 하나를 로드합니다. DynamicMaster1.master의 소스 코드는 목록 16에 있고, DynamicMaster2.master의 소스 코드는 목록 17에 있습니다. 두 마스터 파일은 이름과 배경색이 다르다는 점을 제외하고는 동일합니다.

목록 16. DynamicMaster1.master(Visual Basic .NET)

<%@ Master Language="vb" %><script runat="server">    Sub Page_Load()        If Not IsPostBack Then            dropMaster.SelectedValue = Profile.Master        End If    End Sub        Sub SelectMaster(ByVal s As Object, ByVal e As EventArgs)        Profile.Master = dropMaster.SelectedValue        Response.Redirect(Request.Path)    End Sub    </script><html><head>    <title>Dynamic Master 1</title></head><body bgcolor="LightYellow"><form runat="server"><h1>Dynamic Master 1</h1><p><asp:DropDownList     id="dropMaster"    AutoPostBack="true"    OnSelectedIndexChanged="SelectMaster"     ValidationGroup="Master"     Runat="Server">    <asp:ListItem Text="Dynamic 1" value="DynamicMaster1.master" />    <asp:ListItem Text="Dynamic 2" value="DynamicMaster2.master" /></asp:DropDownList></p><asp:contentplaceholder     id="ContentPlaceHolder1"     runat="server"  /></form></body></html>

목록 16. DynamicMaster1.master(C#)

<%@ Master Language="c#" %><script runat="server">        void Page_Load() {        if (!IsPostBack)            dropMaster.SelectedValue = Profile.Master;        }        void SelectMaster(Object s, EventArgs e) {        Profile.Master = dropMaster.SelectedValue;        Response.Redirect(Request.Path);    }    </script><html><head>    <title>Dynamic Master 1</title></head><body bgcolor="LightYellow"><form id="Form1" runat="server"><h1>Dynamic Master 1 CS</h1><p><asp:DropDownList     id="dropMaster"    AutoPostBack="true"    OnSelectedIndexChanged="SelectMaster"     ValidationGroup="Master"     Runat="Server">    <asp:ListItem Text="Dynamic 1" value="DynamicMaster1.master" />    <asp:ListItem Text="Dynamic 2" value="DynamicMaster2.master" /></asp:DropDownList></p><asp:contentplaceholder     id="ContentPlaceHolder1"     runat="server"  /></form></body></html>

목록 17. DynamicMaster2.master(Visual Basic .NET)

<%@ Master Language="vb" %><script runat="server">    Sub Page_Load()        If Not IsPostBack Then            dropMaster.SelectedValue = Profile.Master        End If    End Sub        Sub SelectMaster(ByVal s As Object, ByVal e As EventArgs)        Profile.Master = dropMaster.SelectedValue        Response.Redirect(Request.Path)    End Sub    </script><html><head>    <title>Dynamic Master 2</title></head><body bgcolor="LightGreen"><form id="Form1" runat="server"><h1>Dynamic Master 2</h1><p><asp:DropDownList     id="dropMaster"    AutoPostBack="true"    OnSelectedIndexChanged="SelectMaster"     ValidationGroup="Master"    Runat="Server">    <asp:ListItem Text="Dynamic 1" value="DynamicMaster1.master" />    <asp:ListItem Text="Dynamic 2" value="DynamicMaster2.master" /></asp:DropDownList></p><asp:contentplaceholder     id="ContentPlaceHolder1"     runat="server"  /></form></body></html>

목록 17. DynamicMaster2.master(C#)

<%@ Master Language="c#" %><script runat="server">        void Page_Load() {        if (!IsPostBack)            dropMaster.SelectedValue = Profile.Master;        }        void SelectMaster(Object s, EventArgs e) {        Profile.Master = dropMaster.SelectedValue;        Response.Redirect(Request.Path);    }    </script><html><head>    <title>Dynamic Master 2</title></head><body bgcolor="LightGreen"><form id="Form1" runat="server"><h1>Dynamic Master 2 CS</h1><p><asp:DropDownList     id="dropMaster"    AutoPostBack="true"    OnSelectedIndexChanged="SelectMaster"     ValidationGroup="Master"    Runat="Server">    <asp:ListItem Text="Dynamic 1" value="DynamicMaster1.master" />    <asp:ListItem Text="Dynamic 2" value="DynamicMaster2.master" /></asp:DropDownList></p><asp:contentplaceholder     id="ContentPlaceHolder1"     runat="server"  /></form></body></html>

두 마스터 페이지에는 사용자가 특정 마스터 페이지를 선택할 수 있는 DropDownList 컨트롤이 있습니다. 마스터 페이지를 선택하면 SelectMaster 메서드가 호출됩니다. 이 메서드는 선택된 마스터 페이지를 사용자 프로필에 할당하고 현재 페이지를 다시 로드합니다. PreInit 이벤트 동안 새로 선택한 마스터 페이지를 로드해야 하기 때문에 페이지 다시 로드 작업이 필요합니다.

결론

개인적으로 마스터 페이지는 ASP.NET 2.0에서 필자가 가장 좋아하는 새 기능입니다. 이 새 기능은 앞으로 ASP.NET 응용 프로그램을 만드는 방법에 가장 큰 영향을 미칠 것입니다. 현재는 익숙치 않은 사용자 컨트롤이나 사용자 지정 기반 Page 클래스를 통해 다시 사용할 수 있는 페이지 레이아웃을 만들고 있습니다만, 마스터 페이지를 사용하면 이 작업을 보다 명확하고 직관적인 방식으로 수행할 수 있습니다. 또한, 무엇보다 Microsoft Visual Studio .NET 2005는 디자이너 기능을 완벽하게 지원하므로 페이지 레이아웃을 만드는 동안 페이지 모양을 미리 볼 수 있습니다.

관련 서적

 


저자 소개

Stephen Walther는 ASP.NET 관련 베스트셀러 서적인 ASP.NET Unleashed의 저자입니다. 또한 Microsoft에서 만든 샘플 ASP.NET 응용 프로그램인 ASP.NET Community Starter Kit 설계자 및 수석 개발자입니다. Stephen의 회사인 Superexpert(http://www.superexpert.com/ )에서는 NASA와 Microsoft를 비롯하여 미국 전역의 회사에 대해 ASP.NET 교육을 제공했습니다

Posted by tornado
|