중첩 마스터 페이지(C#)Nested Master Pages (C#)

Scott Mitchellby Scott Mitchell

코드 다운로드 또는 PDF 다운로드Download Code or Download PDF

한 마스터 페이지를 다른 마스터 페이지에 중첩 하는 방법을 보여 줍니다.Shows how to nest one master page within another.

소개Introduction

지난 9 개 자습서를 진행 하는 과정에서 마스터 페이지를 사용 하 여 사이트 전체 레이아웃을 구현 하는 방법을 살펴보았습니다.Over the course of the past nine tutorials we have seen how to implement a site-wide layout with master pages. 간단히 말해서, 마스터 페이지를 사용 하면 페이지 개발자가 콘텐츠 페이지 별로 사용자 지정할 수 있는 특정 영역과 함께 마스터 페이지에서 일반 태그를 정의할 수 있습니다.In a nutshell, master pages allow us, the page developer, to define common markup in the master page along with specific regions that can be customized on a content page-by-content page basis. 마스터 페이지의 ContentPlaceHolder 컨트롤은 사용자 지정 가능한 영역을 의미 합니다. ContentPlaceHolder 컨트롤에 대 한 사용자 지정 태그는 콘텐츠 컨트롤을 통해 콘텐츠 페이지에 정의 됩니다.The ContentPlaceHolder controls in a master page indicate the customizable regions; the customized markup for the ContentPlaceHolder controls are defined in the content page via Content controls.

지금까지 살펴본 마스터 페이지 기술은 전체 사이트에서 단일 레이아웃을 사용 하는 경우에 유용 합니다.The master page techniques we've explored thus far are great if you have a single layout used across the entire site. 그러나 많은 규모의 웹 사이트에는 다양 한 섹션에서 사용자 지정 된 사이트 레이아웃이 있습니다.However, many large websites have a site layout that is customized across various sections. 예를 들어 병원 직원이 환자 정보, 활동 및 요금 청구를 관리 하는 데 사용 하는 의료 보험 응용 프로그램을 생각해 보세요.For example, consider a health care application used by hospital staff to manage patient information, activities, and billing. 이 응용 프로그램에는 다음과 같은 세 가지 유형의 웹 페이지가 있을 수 있습니다.There may be three types of web pages in this application:

  • 직원 구성원이 가용성을 업데이트 하거나 일정을 보거나 휴가 시간을 요청할 수 있는 구성원 관련 페이지를 담당 합니다.Staff member-specific pages where staff members can update availability, view schedules, or request vacation time.
  • 직원 구성원이 특정 환자에 대 한 정보를 보거나 편집 하는 환자 별 페이지Patient-specific pages where staff members view or edit information for a specific patient.
  • 회계사가 현재 클레임 상태와 재무 보고서를 검토 하는 청구 별 페이지Billing-specific pages where accountants review current claim statuses and financial reports.

모든 페이지는 위쪽에 있는 메뉴 및 맨 아래에 자주 사용 되는 일련의 링크와 같은 공통 레이아웃을 공유할 수 있습니다.Every page might share a common layout, such as a menu across the top and a series of frequently used links along the bottom. 하지만 직원, 환자 및 청구 관련 페이지는이 일반 레이아웃을 사용자 지정 해야 할 수 있습니다.But the staff-, patient-, and billing-specific pages may need to customize this generic layout. 예를 들어 모든 직원 관련 페이지에는 현재 로그온 한 사용자의 사용 가능 여부와 매일 일정을 보여 주는 일정 및 작업 목록이 포함 되어 있을 것입니다.For example, perhaps all staff-specific pages should include a calendar and task list showing the currently logged on user's availability and daily schedule. 모든 환자 관련 페이지에서 정보를 편집 중인 환자에 대 한 이름, 주소 및 보험 정보를 표시 해야 하는 경우가 있을 수 있습니다.Perhaps all patient-specific pages need to show the name, address, and insurance information for the patient whose information is being edited.

중첩 된 마스터 페이지를 사용 하 여 이러한 사용자 지정 레이아웃을 만들 수 있습니다.It's possible to create such customized layouts by using nested master pages. 위의 시나리오를 구현 하기 위해 먼저 사용자 지정할 수 있는 영역을 정의 하는 ContentPlaceHolders 표시자를 사용 하 여 사이트 전체 레이아웃, 메뉴 및 바닥글 콘텐츠를 정의 하는 마스터 페이지를 만듭니다.To implement the above scenario, we would start by creating a master page that defined the site-wide layout, the menu and footer content, with ContentPlaceHolders defining the customizable regions. 그런 다음 각각의 웹 페이지 유형별로 하나씩 세 개의 중첩 된 마스터 페이지를 만듭니다.We would then create three nested master pages, one for each type of web page. 각 중첩 된 마스터 페이지는 마스터 페이지를 사용 하는 콘텐츠 페이지 유형 사이에서 콘텐츠를 정의 합니다.Each nested master page would define the content among the type of content pages that use the master page. 즉, 환자 별 콘텐츠 페이지의 중첩 된 마스터 페이지에는 편집 중인 환자에 대 한 정보를 표시 하는 태그 및 프로그래밍 논리가 포함 됩니다.In other words, the nested master page for patient-specific content pages would include markup and programmatic logic for displaying information about the patient being edited. 새 환자 관련 페이지를 만들 때이 중첩 된 마스터 페이지에 바인딩합니다.When creating a new patient-specific page we would bind it to this nested master page.

이 자습서에서는 먼저 중첩 된 마스터 페이지의 이점을 강조 표시 합니다.This tutorial starts by highlighting the benefits of nested master pages. 그런 다음 중첩 된 마스터 페이지를 만들고 사용 하는 방법을 보여 줍니다.It then shows how to create and use nested master pages.

Note

.NET Framework 버전 2.0부터 중첩 된 마스터 페이지를 사용할 수 있습니다.Nested master pages have been possible since version 2.0 of the .NET Framework. 그러나 Visual Studio 2005에는 중첩 된 마스터 페이지에 대 한 디자인 타임 지원이 포함 되지 않았습니다.However, Visual Studio 2005 did not include design-time support for nested master pages. Visual Studio 2008은 중첩 된 마스터 페이지에 다양 한 디자인 타임 환경을 제공 한다는 것이 좋습니다.The good news is that Visual Studio 2008 offers a rich design-time experience for nested master pages. 중첩 된 마스터 페이지를 사용 하려는 경우 Visual Studio 2005을 계속 사용 하려면 Scott Guthrie의 블로그 항목, VS 2005 디자인 타임의 중첩 된 마스터 페이지에 대 한 팁을 확인 하세요.If you are interested in using nested master pages but are still using Visual Studio 2005, check out Scott Guthrie's blog entry, Tips for Nested Master Pages in VS 2005 Design-Time.

중첩 된 마스터 페이지의 이점The Benefits of Nested Master Pages

대부분의 웹 사이트에는 중요 한 사이트 디자인 뿐만 아니라 특정 페이지 유형에 특정 한 사용자 지정 디자인이 있습니다.Many websites have an overarching site design as well as more customized designs specific to certain types of pages. 예를 들어 데모 웹 응용 프로그램에서 기본적인 관리 섹션 (~/Admin 폴더의 페이지)을 만들었습니다.For instance, in our demo web application we have created a rudimentary Administration section (the pages in the ~/Admin folder). 현재 ~/Admin 폴더의 웹 페이지는 사용자의 선택에 따라 관리 섹션 (Site.master 또는 Alternate.master)에 없는 페이지와 동일한 마스터 페이지를 사용 합니다.Currently the web pages in the ~/Admin folder use the same master page as those pages not in the administration section (namely, Site.master or Alternate.master, depending on the user's selection).

Note

지금은 사이트에 Site.master마스터 페이지가 하나만 있는 것으로 가정 합니다.For now, pretend that our site has just one master page, Site.master. 이 자습서의 뒷부분에 나오는 "관리 섹션에 대해 중첩 된 마스터 페이지 사용"으로 시작 하는 두 개 이상의 마스터 페이지로 중첩 된 마스터 페이지를 사용 하는 것이 좋습니다.We'll address using nested master pages with two (or more) master pages starting with "Using a Nested Master Page for the Administration Section" later in this tutorial.

다른 방법으로 사이트의 다른 페이지에 표시 되지 않는 추가 정보 또는 링크를 포함 하도록 관리 페이지의 레이아웃을 사용자 지정 하 라는 메시지가 표시 된다고 가정 합니다.Imagine that we were asked to customize the layout of the Administration pages to include additional information or links that would not otherwise be present in other pages in the site. 이 요구 사항을 구현 하는 방법에는 다음 네 가지가 있습니다.There are four techniques to implement this requirement:

  1. 관리 관련 정보 및 ~/Admin 폴더의 모든 콘텐츠 페이지에 대 한 링크를 수동으로 추가 합니다.Manually add the Administration-specific information and links to every content page in the ~/Admin folder.
  2. 관리 섹션 관련 정보 및 링크를 포함 하도록 Site.master 마스터 페이지를 업데이트 한 다음, 관리 페이지 중 하나를 방문 하 고 있는지 여부에 따라 이러한 섹션을 표시 하거나 숨기려면 마스터 페이지에 코드를 추가 합니다.Update the Site.master master page to include the Administration section-specific information and links, and then add code to the master page to show or hide these sections based on whether one of the Administration pages is being visited.
  3. 관리 섹션에 대해 특별히 새 마스터 페이지를 만들고 Site.master에서 태그를 복사 하 고 관리 섹션 관련 정보 및 링크를 추가한 다음 ~/Admin 폴더의 콘텐츠 페이지를 업데이트 하 여이 새 마스터 페이지를 사용 합니다.Create a new master page specifically for the Administration section, copy over the markup from Site.master, add the Administration section-specific information and links, and then update the content pages in the ~/Admin folder to use this new master page.
  4. Site.master에 바인딩하고 ~/Admin 폴더의 콘텐츠 페이지에서이 새 중첩 된 마스터 페이지를 사용 하도록 하는 중첩 된 마스터 페이지를 만듭니다.Create a nested master page that binds to Site.master and have the content pages in the ~/Admin folder use this new nested master page. 이 중첩 된 마스터 페이지에는 관리 페이지에만 적용 되는 추가 정보 및 링크만 포함 되며 Site.master에 이미 정의 되어 있는 태그는 반복할 필요가 없습니다.This nested master page would include just the additional information and links specific to the Administration pages and would not need to repeat the markup already defined in Site.master.

첫 번째 옵션은 가장 palatable입니다.The first option is the least palatable. 마스터 페이지를 사용 하는 전체 지점은 일반적인 태그를 수동으로 복사 하 여 새 ASP.NET 페이지에 붙여 넣을 필요가 없습니다.The whole point of using master pages is to move away from having to manually copy and paste common markup to new ASP.NET pages. 두 번째 옵션은 허용 되지만 응용 프로그램을 유지 관리 하는 경우에만 표시 되는 태그를 사용 하 여 마스터 페이지의 상태를 변경 하 고, 이러한 태그를 해결 하기 위해 마스터 페이지를 편집 하는 개발자가 필요 하며, 정확히, 특정 태그는 숨겨진 경우에만 표시 됩니다.The second option is acceptable, but makes the application less maintainable as it bulks up the master pages with markup that is only occasionally displayed and requires developers editing the master page to work around this markup and to have to remember when, exactly, certain markup is displayed versus when it is hidden. 이 방법을 사용 하면이 단일 마스터 페이지에서 수용 해야 하는 더 많은 유형의 웹 페이지에서 사용자 지정을 수행 하는 것이 더 어렵습니다.This approach would be less tenable as customizations from more and more types of web pages needed to be accommodated by this single master page.

세 번째 옵션은 두 번째 옵션으로 표시 되는 복잡 하 고 복잡 한 문제를 제거 합니다.The third option removes the clutter and complexity issues the surfaced with the second option. 그러나이 옵션의 세 가지 주요 단점은 Site.master에서 일반적인 레이아웃을 복사 하 여 새 관리 섹션인 마스터 페이지에 붙여 넣는 것입니다.However, option three's main drawback is that it requires us to copy and paste the common layout from Site.master to the new Administration section-specific master page. 나중에 사이트 전체 레이아웃을 변경 하려는 경우 두 위치에서 변경 해야 합니다.If we later decide to change the site-wide layout we have to remember to change it in two places.

네 번째 옵션인 중첩 된 마스터 페이지에서는 두 번째 및 세 번째 옵션을 제공 합니다.The fourth option, nested master pages, give us the best of the second and third options. 사이트 전체 레이아웃 정보는 최상위 마스터 페이지인 하나의 파일에서 유지 관리 되는 반면 특정 지역과 관련 된 콘텐츠는 서로 다른 파일로 구분 됩니다.The site-wide layout information is maintained in one file - the top-level master page - while the content specific to particular regions is separated out into different files.

이 자습서에서는 간단한 중첩 된 마스터 페이지를 만들고 사용 하는 방법을 살펴봅니다.This tutorial starts with a look at creating and using a simple nested master page. 새 최상위 마스터 페이지, 두 개의 중첩 된 마스터 페이지 및 두 개의 콘텐츠 페이지를 만듭니다.We create a brand new top-level master page, two nested master pages, and two content pages. "관리 섹션에 대해 중첩 된 마스터 페이지 사용"부터 중첩 된 마스터 페이지 사용을 포함 하도록 기존 마스터 페이지 아키텍처를 업데이트 하는 것을 확인 합니다.Starting with "Using a Nested Master Page for the Administration Section," we look at updating our existing master page architecture to include the use of nested master pages. 특히 중첩 된 마스터 페이지를 만들고이를 사용 하 여 ~/Admin 폴더의 콘텐츠 페이지에 대 한 추가 사용자 지정 콘텐츠를 포함 합니다.Specifically, we create a nested master page and use it to include additional custom content for the content pages in the ~/Admin folder.

1 단계: 간단한 최상위 마스터 페이지 만들기Step 1: Creating a Simple Top-Level Master Page

기존 마스터 페이지 중 하나를 기반으로 하는 중첩 된 마스터를 만든 다음 기존 콘텐츠 페이지를 업데이트 하 여 최상위 마스터 페이지 대신이 새 중첩 마스터 페이지를 사용 하면 기존 콘텐츠 페이지에 이미 특정 최상위 마스터 페이지에 정의 된 ContentPlaceHolder 컨트롤입니다.Creating a nested master based on one of the existing master pages and then updating an existing content page to use this new nested master page instead of the top-level master page entails some complexity because the existing content pages already expect certain ContentPlaceHolder controls defined in the top-level master page. 따라서 중첩 된 마스터 페이지에도 동일한 이름을 가진 동일한 ContentPlaceHolder 컨트롤이 포함 되어야 합니다.Therefore, the nested master page must also include the same ContentPlaceHolder controls with the same names. 또한 특정 데모 응용 프로그램에는 사용자의 기본 설정에 따라 콘텐츠 페이지에 동적으로 할당 되는 두 개의 마스터 페이지 (Site.masterAlternate.master)가 있으며,이는이 복잡성을 추가로 추가 합니다.Furthermore, our particular demo application has two master pages (Site.master and Alternate.master) that are dynamically assigned to a content page based on a user's preferences, which further adds to this complexity. 이 자습서의 뒷부분에서 중첩 된 마스터 페이지를 사용 하도록 기존 응용 프로그램을 업데이트 하는 방법에 대해 살펴보겠습니다 .이에 대해서는 먼저 간단한 중첩 된 마스터 페이지 예제에 집중 하겠습니다.We will look at updating the existing application to use nested master pages later in this tutorial, but let's first focus on a simple nested master pages example.

NestedMasterPages 이라는 새 폴더를 만든 다음 Simple.master라는 폴더에 새 마스터 페이지 파일을 추가 합니다.Create a new folder named NestedMasterPages and then add a new master page file to that folder named Simple.master. 이 폴더 및 파일이 추가 된 후의 솔루션 탐색기 스크린샷은 그림 1을 참조 하세요. 솔루션 탐색기에서 AlternateStyles.css 스타일 시트 파일을 디자이너로 끌어 옵니다.(See Figure 1 for a screen shot of the Solution Explorer after this folder and file have been added.) Drag the AlternateStyles.css style sheet file from the Solution Explorer onto the Designer. 이렇게 하면 <link> 요소가 <head> 요소의 스타일 시트 파일에 추가 되 고, 그 후에 마스터 페이지의 <head> 요소의 태그가 다음과 같이 표시 됩니다.This adds a <link> element to the style sheet file in the <head> element, after which the master page's <head> element's markup should look like:

<head runat="server">
 <title>Untitled Page</title> 
 <asp:ContentPlaceHolder id="head" runat="server"> 
 </asp:ContentPlaceHolder>
 <link href="../AlternateStyles.css" rel="stylesheet" type="text/css" /> 
</head>

그런 다음 Simple.master웹 폼에 다음 태그를 추가 합니다.Next, add the following markup within the Web Form of Simple.master:

<div id="topContent"> 
 <asp:HyperLink ID="lnkHome" runat="server" 
 NavigateUrl="~/NestedMasterPages/Default.aspx"
 Text="Nested Master Pages Tutorial (Simple)" /> 
</div> 
<div id="mainContent"> 
 <asp:ContentPlaceHolder id="MainContent" runat="server"> 
 </asp:ContentPlaceHolder>
</div>

이 태그는 페이지 맨 위에 있는 "중첩 된 마스터 페이지 (단순)" 라는 링크를 짙은 배경에 진한 흰색 글꼴로 표시 합니다.This markup displays a link titled "Nested Master Pages (Simple)" at the top of the page in a large white font on a navy background. MainContent ContentPlaceHolder입니다.Beneath that is the MainContent ContentPlaceHolder. 그림 1에서는 Visual Studio 디자이너에서 로드 될 때 Simple.master 마스터 페이지를 보여 줍니다.Figure 1 shows the Simple.master master page when loaded in the Visual Studio Designer.

중첩 된 마스터 페이지 관리 섹션의 페이지와 관련 된 콘텐츠를 정의 합니다.The Nested Master Page Defines Content Specific to the Pages in the Administration Section

그림 01: 중첩 된 마스터 페이지는 관리 섹션 (전체 크기 이미지를 보려면 클릭)의 페이지와 관련 된 콘텐츠를 정의 합니다.Figure 01: The Nested Master Page Defines Content Specific to the Pages in the Administration Section (Click to view full-size image)

2 단계: 간단한 중첩 된 마스터 페이지 만들기Step 2: Creating a Simple Nested Master Page

Simple.master에는 두 가지 ContentPlaceHolder 컨트롤이 포함 되어 있습니다. MainContent ContentPlaceHolder는 웹 양식 내에서 <head> 요소의 head ContentPlaceHolder와 함께 추가 됩니다.Simple.master contains two ContentPlaceHolder controls: the MainContent ContentPlaceHolder we added within the Web Form along with the head ContentPlaceHolder in the <head> element. 콘텐츠 페이지를 만들고 Simple.master에 바인딩하는 경우 콘텐츠 페이지에 두 ContentPlaceHolders 표시자를 참조 하는 두 개의 콘텐츠 컨트롤이 있습니다.If we were to create a content page and bind it to Simple.master the content page would have two Content controls referencing the two ContentPlaceHolders. 마찬가지로 중첩 된 마스터 페이지를 만들고 Simple.master 바인딩하는 경우 중첩 된 마스터 페이지에는 두 개의 콘텐츠 컨트롤이 있습니다.Similarly, if we create a nested master page and bind it to Simple.master then the nested master page will have two Content controls.

SimpleNested.master이라는 NestedMasterPages 폴더에 새 중첩 된 마스터 페이지를 추가 해 보겠습니다.Let's add a new nested master page to the NestedMasterPages folder named SimpleNested.master. NestedMasterPages 폴더를 마우스 오른쪽 단추로 클릭 하 고 추가 새 항목을 선택 합니다.Right-click on the NestedMasterPages folder and choose Add New Item. 그러면 그림 2에 표시 된 새 항목 추가 대화 상자가 표시 됩니다.This brings up the Add New Item dialog box shown in Figure 2. 마스터 페이지 템플릿 유형을 선택 하 고 새 마스터 페이지의 이름을 입력 합니다.Select the Master Page template type and type in the name of the new master page. 새 마스터 페이지가 중첩 된 마스터 페이지 여야 함을 나타내려면 "마스터 페이지 선택" 확인란을 선택 합니다.To indicate that the new master page should be a nested master page, check the "Select master page" checkbox.

그런 다음 추가 단추를 클릭 합니다.Next, click the Add button. 그러면 마스터 페이지에 콘텐츠 페이지를 바인딩할 때 표시 되는 것과 동일한 마스터 페이지 선택 대화 상자가 표시 됩니다 (그림 3 참조).This will display the same Select a Master Page dialog box you see when binding a content page to a master page (see Figure 3). NestedMasterPages 폴더에서 Simple.master 마스터 페이지를 선택 하 고 확인을 클릭 합니다.Choose the Simple.master master page in the NestedMasterPages folder and click OK.

Note

웹 사이트 프로젝트 모델 대신 웹 응용 프로그램 프로젝트 모델을 사용 하 여 ASP.NET 웹 사이트를 만든 경우 그림 2에 표시 된 새 항목 추가 대화 상자에 "마스터 페이지 선택" 확인란이 표시 되지 않습니다.If you created your ASP.NET website using the Web Application Project model instead of the Web Site Project model you will not see the "Select master page" checkbox in the Add New Item dialog box shown in Figure 2. 웹 응용 프로그램 프로젝트 모델을 사용할 때 중첩 된 마스터 페이지를 만들려면 마스터 페이지 템플릿 대신 중첩 된 마스터 페이지 템플릿을 선택 해야 합니다.To create a nested master page when using the Web Application Project model you must choose the Nested Master Page template (instead of the Master Page template). 중첩 된 마스터 페이지 템플릿을 선택 하 고 추가를 클릭 하면 그림 3에 표시 된 것과 같은 마스터 페이지 선택 대화 상자가 표시 됩니다.After selecting the Nested Master Page template and clicking Add, the same Select a Master Page dialog box shown in Figure 3 will appear.

"마스터 페이지 선택" 확인란을 선택 하 여 중첩 된 마스터 페이지를 추가 합니다.Check the "Select master page" Checkbox to Add a Nested Master Page

그림 02: "마스터 페이지 선택" 확인란을 선택 하 여 중첩 된 마스터 페이지 추가 (전체 크기 이미지를 보려면 클릭)Figure 02: Check the "Select master page" Checkbox to Add a Nested Master Page (Click to view full-size image)

중첩 된 마스터 페이지를 간단한 마스터 페이지에 바인딩합니다.Bind the Nested Master Page to the Simple.master Master Page

그림 03: 중첩 된 마스터 페이지를 Simple.master 마스터 페이지에 바인딩 (전체 크기 이미지를 보려면 클릭)Figure 03: Bind the Nested Master Page to the Simple.master Master Page (Click to view full-size image)

아래에 표시 된 중첩 된 마스터 페이지의 선언 태그에는 최상위 마스터 페이지의 두 ContentPlaceHolder 컨트롤을 참조 하는 두 개의 콘텐츠 컨트롤이 포함 되어 있습니다.The nested master page's declarative markup, shown below, contains two Content controls referencing the top-level master page's two ContentPlaceHolder controls.

<%@ Master Language="C#" MasterPageFile="~/NestedMasterPages/Simple.master" AutoEventWireup="false" CodeFile="SimpleNested.master.cs" Inherits="NestedMasterPages_SimpleNested" %> 
 <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
 </asp:Content> 
 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server"> 
 </asp:Content>

<%@ Master %> 지시어를 제외 하 고, 중첩 된 마스터 페이지의 초기 선언 태그는 콘텐츠 페이지를 동일한 최상위 마스터 페이지에 바인딩할 때 처음 생성 된 태그와 동일 합니다.Except for the <%@ Master %> directive, the nested master page's initial declarative markup is identical to the markup that is initially generated when binding a content page to the same top-level master page. 콘텐츠 페이지의 <%@ Page %> 지시문 처럼 여기에 <%@ Master %> 지시문은 중첩 된 마스터 페이지의 부모 마스터 페이지를 지정 하는 MasterPageFile 특성을 포함 합니다.Like a content page's <%@ Page %> directive, the <%@ Master %> directive here includes a MasterPageFile attribute that specifies the nested master page's parent master page. 중첩 된 마스터 페이지와 동일한 최상위 마스터 페이지에 바인딩된 콘텐츠 페이지의 주요 차이점은 중첩 된 마스터 페이지에 ContentPlaceHolder 컨트롤을 포함할 수 있다는 것입니다.The main difference between the nested master page and a content page bound to the same top-level master page is that the nested master page can include ContentPlaceHolder controls. 중첩 된 마스터 페이지의 ContentPlaceHolder 컨트롤은 콘텐츠 페이지가 태그를 사용자 지정할 수 있는 영역을 정의 합니다.The nested master page's ContentPlaceHolder controls define the regions where the content pages can customize the markup.

"Hello, from SimpleNested!" 라는 텍스트가 표시 되도록이 중첩 된 마스터 페이지를 업데이트 합니다.Update this nested master page so that it displays the text "Hello, from SimpleNested!" MainContent ContentPlaceHolder 컨트롤에 해당 하는 콘텐츠 컨트롤입니다.in the Content control that corresponds to the MainContent ContentPlaceHolder control.

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server"> 
 <p>Hello, from SimpleNested!</p>
</asp:Content>

이러한 추가 작업을 수행한 후에는 중첩 된 마스터 페이지를 저장 한 다음 Default.aspx이라는 NestedMasterPages 폴더에 새 콘텐츠 페이지를 추가 하 고 SimpleNested.master 마스터 페이지에 바인딩합니다.After making this addition, save the nested master page and then add a new content page to the NestedMasterPages folder named Default.aspx, and bind it to the SimpleNested.master master page. 이 페이지를 추가할 때 콘텐츠 컨트롤이 포함 되어 있지 않은 것을 볼 수 있습니다 (그림 4 참조).Upon adding this page you may be surprised to see that it contains no Content controls (see Figure 4)! 콘텐츠 페이지는 부모 마스터 페이지의 contentplaceholders 표시자에만 액세스할 수 있습니다.A content page can only access its parent master page's ContentPlaceHolders. SimpleNested.master에 ContentPlaceHolder 컨트롤이 포함 되어 있지 않습니다. 따라서이 마스터 페이지에 바인딩된 콘텐츠 페이지에는 콘텐츠 컨트롤을 포함할 수 없습니다.SimpleNested.master does not contain any ContentPlaceHolder controls; therefore, any content page bound to this master page cannot contain any Content controls.

새 콘텐츠 페이지에 콘텐츠 컨트롤이 포함 되어 있지 The New Content Page Contains No Content Controls

그림 04: 새 콘텐츠 페이지에 콘텐츠 컨트롤 없음 (전체 크기 이미지를 보려면 클릭)Figure 04: The New Content Page Contains No Content Controls (Click to view full-size image)

ContentPlaceHolder 컨트롤을 포함 하도록 중첩 된 마스터 페이지 (SimpleNested.master)를 업데이트 해야 합니다.What we need to do is update the nested master page (SimpleNested.master) to include ContentPlaceHolder controls. 일반적으로 중첩 된 마스터 페이지는 부모 마스터 페이지에서 정의 된 각 ContentPlaceHolder에 대 한 ContentPlaceHolder를 포함 하 여 해당 자식 마스터 페이지 또는 콘텐츠 페이지가 최상위 마스터 페이지의 ContentPlaceHolder와 함께 작동 하도록 할 수 있습니다. 제어가.Typically you'll want your nested master pages to include a ContentPlaceHolder for each ContentPlaceHolder defined by its parent master page, thereby allowing its child master page or content page to work with any of the top-level master page's ContentPlaceHolder controls.

두 콘텐츠 컨트롤에 ContentPlaceHolder를 포함 하도록 SimpleNested.master 마스터 페이지를 업데이트 합니다.Update the SimpleNested.master master page to include a ContentPlaceHolder in its two Content controls. ContentPlaceHolder 컨트롤에 콘텐츠 컨트롤이 참조 하는 ContentPlaceHolder 컨트롤과 동일한 이름을 지정 합니다.Give the ContentPlaceHolder controls the same name as the ContentPlaceHolder control their Content control refers to. 즉, Simple.masterMainContent ContentPlaceHolder를 참조 하는 SimpleNested.master 콘텐츠 컨트롤에 MainContent 이라는 ContentPlaceHolder 컨트롤을 추가 합니다.That is, add a ContentPlaceHolder control named MainContent to the Content control in SimpleNested.master that references the MainContent ContentPlaceHolder in Simple.master. 콘텐츠 컨트롤에서 head ContentPlaceHolder를 참조 하는 동일한 작업을 수행 합니다.Do the same thing in the Content control that references the head ContentPlaceHolder.

Note

중첩 된 마스터 페이지에서 ContentPlaceHolder 컨트롤의 이름을 최상위 마스터 페이지의 ContentPlaceHolders 표시자와 동일 하 게 지정 하는 것이 좋지만이 명명 대칭은 필요 하지 않습니다.While I recommend naming the ContentPlaceHolder controls in the nested master page the same as the ContentPlaceHolders in the top-level master page, this naming symmetry is not required. 중첩 된 마스터 페이지의 ContentPlaceHolder 컨트롤에 원하는 이름을 지정할 수 있습니다.You can give the ContentPlaceHolder controls in your nested master page any name you like. 그러나 최상위 마스터 페이지와 중첩 된 마스터 페이지에서 동일한 이름을 사용 하는 경우 어떤 ContentPlaceHolders 표시 자가 페이지 영역에 해당 하는지 쉽게 기억할 수 있습니다.However, I find it easier to remember what ContentPlaceHolders correspond with what regions of the page if my top-level master page and nested master pages use the same names.

이러한 추가 작업을 수행한 후 SimpleNested.master 마스터 페이지의 선언적 태그가 다음과 같이 표시 됩니다.After making these additions your SimpleNested.master master page's declarative markup should look similar to the following:

<%@ Master Language="C#" MasterPageFile="~/NestedMasterPages/Simple.master"AutoEventWireup="false" CodeFile="SimpleNested.master.cs" Inherits="NestedMasterPages_SimpleNested" %> 
 <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
 <asp:ContentPlaceHolder ID="head" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content> 
 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server"> 
 <p>Hello, from SimpleNested!</p>
 <asp:ContentPlaceHolder ID="MainContent" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content>

방금 만든 Default.aspx 콘텐츠 페이지를 삭제 한 다음 다시 추가 하 여 SimpleNested.master 마스터 페이지에 바인딩합니다.Delete the Default.aspx content page we just created and then re-add it, binding it to the SimpleNested.master master page. 이번에는 Visual Studio가 Default.aspx에 두 콘텐츠 컨트롤을 추가 하 여 이제 SimpleNested.master에 정의 된 ContentPlaceHolders 표시자를 참조 합니다 (그림 6 참조).This time Visual Studio adds two Content controls to the Default.aspx, referencing the ContentPlaceHolders now defined in SimpleNested.master (see Figure 6). "Hello, from default.aspx!" 텍스트를 추가 합니다.Add the text, "Hello, from Default.aspx!" MainContent를 참조 하는 콘텐츠 컨트롤입니다.in the Content control that referenced MainContent.

그림 5에는 여기에 포함 된 세 가지 엔터티 (Simple.master, SimpleNested.masterDefault.aspx와 서로 관련 된 방법이 나와 있습니다.Figure 5 shows the three entities involved here - Simple.master, SimpleNested.master, and Default.aspx - and how they relate to one another. 다이어그램에 표시 된 것 처럼 중첩 된 마스터 페이지는 부모의 ContentPlaceHolder에 대 한 콘텐츠 컨트롤을 구현 합니다.As the diagram shows, the nested master page implements Content controls for its parent's ContentPlaceHolder. 콘텐츠 페이지에서 이러한 영역에 액세스할 수 있어야 하는 경우 중첩 된 마스터 페이지는 콘텐츠 컨트롤에 고유한 ContentPlaceHolders 표시자를 추가 해야 합니다.If these regions need to be accessible to the content page, the nested master page must add its own ContentPlaceHolders to the Content controls.

최상위 수준 및 중첩 된 마스터 페이지 콘텐츠 페이지의 레이아웃을 지시 합니다.The Top-Level and Nested Master Pages Dictate the Content Page's Layout

그림 05: 최상위 및 중첩 마스터 페이지에서 콘텐츠 페이지의 레이아웃 결정 (전체 크기 이미지를 보려면 클릭)Figure 05: The Top-Level and Nested Master Pages Dictate the Content Page's Layout (Click to view full-size image)

이 동작은 콘텐츠 페이지 또는 마스터 페이지가 부모 마스터 페이지의 cognizant 하는 방법을 보여 줍니다.This behavior illustrates how a content page or master page is only cognizant of its parent master page. 이 동작은 Visual Studio 디자이너에도 표시 됩니다.This behavior is also indicated by the Visual Studio Designer. 그림 6에서는 Default.aspx에 대 한 디자이너를 보여 줍니다.Figure 6 shows the Designer for Default.aspx. 디자이너는 콘텐츠 페이지에서 편집할 수 있는 지역이 명확 하 게 표시 되는 반면, 어떤 부분은 중첩 된 마스터 페이지에서 편집할 수 없는 영역이 명확 하 게 표시 되는 것이 아니라 최상위 마스터 페이지에서 어떤 지역이 어떤 영역 인지 명확 하지 않습니다.While the Designer clearly shows what regions are editable from the content page and what portions aren't, it doesn't disambiguate what non-editable regions are from the nested master page and what regions are from the top-level master page.

현재 콘텐츠 페이지에 중첩 된 마스터 페이지의 ContentPlaceHolders 표시자에 대 한 콘텐츠 컨트롤이 포함 되어 The Content Page Now Includes Content Controls for the Nested Master Page's ContentPlaceHolders

그림 06: 이제 콘텐츠 페이지에 중첩 된 마스터 페이지의 contentplaceholders 표시자에 대 한 콘텐츠 컨트롤 포함 (전체 크기 이미지를 보려면 클릭)Figure 06: The Content Page Now Includes Content Controls for the Nested Master Page's ContentPlaceHolders (Click to view full-size image)

3 단계: 간단한 중첩 된 두 번째 마스터 페이지 추가Step 3: Adding a Second Simple Nested Master Page

중첩 된 마스터 페이지의 장점에는 중첩 된 마스터 페이지가 여러 개 있을 때 더 분명 하 게 나타납니다.The benefit of nested master pages is more evident when there are multiple nested master pages. 이 혜택을 설명 하려면 NestedMasterPages 폴더에 중첩 된 다른 마스터 페이지를 만듭니다. 새 중첩 된 마스터 페이지의 이름을 SimpleNestedAlternate.master 하 여 Simple.master 마스터 페이지에 바인딩합니다.To illustrate this benefit, create another nested master page in the NestedMasterPages folder; name this new nested master page SimpleNestedAlternate.master and bind it to the Simple.master master page. 2 단계에서 했던 것 처럼 중첩 된 마스터 페이지의 두 콘텐츠 컨트롤에 ContentPlaceHolder 컨트롤을 추가 합니다.Add ContentPlaceHolder controls in the nested master page's two Content controls like we did in Step 2. 또한 "Hello, in SimpleNestedAlternate!" 텍스트를 추가 합니다.Also add the text, "Hello, from SimpleNestedAlternate!" 최상위 마스터 페이지의 MainContent ContentPlaceHolder에 해당 하는 콘텐츠 컨트롤입니다.in the Content control that corresponds to the top-level master page's MainContent ContentPlaceHolder. 이렇게 변경한 후에는 새 중첩 된 마스터 페이지의 선언적 태그가 다음과 같이 표시 됩니다.After making these changes your new nested master page's declarative markup should look similar to the following:

<%@ Master Language="C#" MasterPageFile="~/NestedMasterPages/Simple.master" AutoEventWireup="false" CodeFile="SimpleNestedAlternate.master.cs" Inherits="NestedMasterPages_SimpleNestedAlternate" %> 
 <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
 <asp:ContentPlaceHolder ID="head" runat="server">
 </asp:ContentPlaceHolder> 
 </asp:Content> 
 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server">
 <p>Hello, from SimpleNestedAlternate!</p> 
 <asp:ContentPlaceHolder ID="MainContent" runat="server">
 </asp:ContentPlaceHolder> 
 </asp:Content>

NestedMasterPages 폴더에 Alternate.aspx 라는 콘텐츠 페이지를 만들고 SimpleNestedAlternate.master 중첩 된 마스터 페이지에 바인딩합니다.Create a content page named Alternate.aspx in the NestedMasterPages folder and bind it to the SimpleNestedAlternate.master nested master page. "Hello, from from from!" 텍스트를 추가 합니다.Add the text, "Hello, from Alternate!" MainContent에 해당 하는 콘텐츠 컨트롤입니다.in the Content control that corresponds to MainContent. 그림 7에는 Visual Studio Designer를 통해 볼 때 Alternate.aspx 표시 됩니다.Figure 7 shows Alternate.aspx when viewed through the Visual Studio Designer.

대체 .aspx는 SimpleNestedAlternate 마스터 페이지에 바인딩되어 있습니다.Alternate.aspx is Bound to the SimpleNestedAlternate.master Master Page

그림 07: Alternate.aspx SimpleNestedAlternate.master 마스터 페이지에 바인딩 (전체 크기 이미지를 보려면 클릭)Figure 07: Alternate.aspx is Bound to the SimpleNestedAlternate.master Master Page (Click to view full-size image)

그림 7의 디자이너를 그림 6의 디자이너와 비교 합니다.Compare the Designer in Figure 7 to the Designer in Figure 6. 두 콘텐츠 페이지는 최상위 마스터 페이지 (Simple.master)에 정의 된 동일한 레이아웃을 공유 합니다. 즉, "중첩 된 마스터 페이지 자습서 (Simple)" 제목이 있습니다.Both content pages share the same layout defined in the top-level master page (Simple.master), namely the "Nested Master Pages Tutorial (Simple)" title. 그러나 모두 부모 마스터 페이지에 정의 된 고유한 내용 ("Hello, from SimpleNested!")이 있습니다.Yet both have distinct content defined in their parent master pages - the text "Hello, from SimpleNested!" 그림 6 및 "Hello, in SimpleNestedAlternate!"in Figure 6 and "Hello, from SimpleNestedAlternate!" 그림 7에 있습니다.in Figure 7. 여기에서 이러한 차이점은 간단 하지만,이 예제를 확장 하 여 보다 의미 있는 차이점을 포함할 수 있습니다.Granted, these differences here are trivial, but you could extend this example to include more meaningful differences. 예를 들어 SimpleNested.master 페이지에는 해당 콘텐츠 페이지에 대 한 옵션이 포함 된 메뉴가 포함 될 수 있지만 SimpleNestedAlternate.master에는 해당 콘텐츠 페이지와 관련 된 정보가 있을 수 있습니다.For instance, the SimpleNested.master page might include a menu with options specific to its content pages, whereas SimpleNestedAlternate.master might have information pertinent to the content pages that bind to it.

이제는 중요 한 사이트 레이아웃을 변경 해야 한다고 가정 합니다.Now, imagine that we needed to make a change to the overarching site layout. 예를 들어 모든 콘텐츠 페이지에 대 한 일반 링크 목록을 추가 하려고 한다고 가정 합니다.For example, imagine that we wanted to add a list of common links to all content pages. 이를 위해 최상위 마스터 페이지를 업데이트 Simple.master합니다.To accomplish this we update the top-level master page, Simple.master. 모든 변경 내용은 중첩 된 마스터 페이지에 즉시 반영 되 고 확장을 통해 해당 콘텐츠 페이지에 반영 됩니다.Any changes there are immediately reflected in its nested master pages and, by extension, their content pages.

가장 중요 한 사이트 레이아웃을 변경할 수 있는 편의성을 보여 주기 위해 Simple.master 마스터 페이지를 열고 topContentmainContent <div> 요소 사이에 다음 태그를 추가 합니다.To demonstrate the ease with which we can change the overarching site layout, open the Simple.master master page and add the following markup between the topContent and mainContent <div> elements:

<div id="navContent"> 
 <asp:HyperLink ID="lnkDefault" runat="server" 
 NavigateUrl="~/NestedMasterPages/Default.aspx" 
 Text="Nested Master Page Example 1" /> 
 | 
 <asp:HyperLink ID="lnkAlternate" runat="server" 
 NavigateUrl="~/NestedMasterPages/Alternate.aspx" 
 Text="Nested Master Page Example 2" /> 
</div>

그러면 Simple.master, SimpleNested.master또는 SimpleNestedAlternate.master에 바인딩되는 모든 페이지의 맨 위에 두 개의 링크가 추가 됩니다. 이러한 변경 내용은 모든 중첩 된 마스터 페이지 및 해당 콘텐츠 페이지에 즉시 적용 됩니다.This adds two links to the top of every page that binds to Simple.master, SimpleNested.master, or SimpleNestedAlternate.master; these changes apply to all nested master pages and their content pages immediately. 그림 8에는 브라우저를 통해 볼 때 Alternate.aspx 표시 됩니다.Figure 8 shows Alternate.aspx when viewed through a browser. 페이지 위쪽에 링크를 추가 합니다 (그림 7 참조).Note the addition of the links at the top of the page (compared to Figure 7).

최상위 마스터 페이지로 변경 된 중첩 된 마스터 페이지 및 해당 콘텐츠 페이지에 즉시 반영 됩니다.Changed to the Top-Level Master Page are Immediately Reflected in its Nested Master Pages and Their Content Pages

그림 08: 최상위 마스터 페이지로 변경 된 내용을 중첩 된 마스터 페이지 및 해당 콘텐츠 페이지에 즉시 반영 (전체 크기 이미지를 보려면 클릭)Figure 08: Changed to the Top-Level Master Page are Immediately Reflected in its Nested Master Pages and Their Content Pages (Click to view full-size image)

관리 섹션에 대해 중첩 된 마스터 페이지 사용Using a Nested Master Page for the Administration Section

이 시점에서 중첩 된 마스터 페이지의 장점을 확인 하 고 ASP.NET 응용 프로그램에서이를 만들고 사용 하는 방법을 살펴보았습니다.At this point we have looked at the advantages of nested master pages and have seen how to create and use them in an ASP.NET application. 그러나 1, 2, 3 단계의 예는 새 최상위 마스터 페이지, 새 중첩 마스터 페이지 및 새 콘텐츠 페이지를 만드는 것과 관련이 있습니다.The examples in Steps 1, 2, and 3, however, involved creating a new top-level master page, new nested master pages, and new content pages. 기존 최상위 마스터 페이지 및 콘텐츠 페이지가 있는 웹 사이트에 새 중첩 된 마스터 페이지를 추가 하는 방법What about adding a new nested master page to a website with an existing top-level master page and content pages?

중첩 된 마스터 페이지를 기존 웹 사이트에 통합 하 고 기존 콘텐츠 페이지와 연결 하는 것은 처음부터 시작 하는 것 보다 약간 더 많은 노력이 필요 합니다.Integrating a nested master page into an existing website and associating it with existing content pages requires a bit more effort than starting from scratch. 4, 5, 6, 7 단계에서는 관리자에 대 한 지침을 포함 하 고 ~/Admin 폴더의 ASP.NET 페이지에서 사용 되는 AdminNested.master 이라는 새로운 중첩 된 마스터 페이지를 포함 하도록 데모 응용 프로그램을 보강 하 여 이러한 문제를 살펴봅니다.Steps 4, 5, 6, and 7 explore these challenges as we augment our demo application to include a new nested master page named AdminNested.master that contains instructions for the administrator and is used by the ASP.NET pages in the ~/Admin folder.

중첩 된 마스터 페이지를 데모 응용 프로그램에 통합 하면 다음과 같은 문제가 있습니다.Integrating a nested master page into our demo application introduces the following hurdles:

  • ~/Admin 폴더의 기존 콘텐츠 페이지에는 마스터 페이지의 특정 요구 사항이 있습니다.The existing content pages in the ~/Admin folder have certain expectations from their master page. 처음에는 특정 ContentPlaceHolder 컨트롤이 있는 것으로 간주 됩니다.For starters, they expect certain ContentPlaceHolder controls to be present. 또한 ~/Admin/AddProduct.aspx~/Admin/Products.aspx 페이지는 마스터 페이지의 public RefreshRecentProductsGrid 메서드를 호출 하거나, GridMessageText 속성을 설정 하거나, 해당 PricesDoubled 이벤트에 대 한 이벤트 처리기를 포함 합니다.Furthermore, the ~/Admin/AddProduct.aspx and ~/Admin/Products.aspx pages call the master page's public RefreshRecentProductsGrid method, set its GridMessageText property, or have an event handler for its PricesDoubled event. 따라서 중첩 된 마스터 페이지는 동일한 ContentPlaceHolders 표시자와 public 멤버를 제공 해야 합니다.Consequently, our nested master page must provide the same ContentPlaceHolders and public members.
  • 이전 자습서에서는 세션 변수에 따라 Page 개체의 MasterPageFile 속성을 동적으로 설정 하도록 BasePage 클래스를 향상 시켰습니다.In the preceding tutorial we enhanced the BasePage class to dynamically set the Page object's MasterPageFile property based on a Session variable. 중첩 된 마스터 페이지를 사용할 때 동적 마스터 페이지를 지 원하는 방법How to we support dynamic master pages when using nested master pages?

이러한 두 가지 문제는 중첩 된 마스터 페이지를 빌드하고 기존 콘텐츠 페이지에서 사용 하기 때문에 발생 합니다.These two challenges will surface as we build the nested master page and use it from our existing content pages. 이러한 문제를 조사 하 고 surmount 합니다.We'll investigate and surmount these issues as they arise.

4 단계: 중첩 된 마스터 페이지 만들기Step 4: Creating the Nested Master Page

첫 번째 작업은 관리 섹션의 페이지에서 사용할 중첩 된 마스터 페이지를 만드는 것입니다.Our first task is to create the nested master page to be used by the pages in the Administration section. 2 단계에서 살펴본 것 처럼 새 중첩 된 마스터 페이지를 추가 하는 경우 중첩 된 마스터 페이지의 부모 마스터 페이지를 지정 해야 합니다.As we saw in Step 2, when adding a new nested master page we need to specify the nested master page's parent master page. 그러나 두 개의 최상위 마스터 페이지인 Site.masterAlternate.master있습니다.But we have two top-level master pages: Site.master and Alternate.master. 이전 자습서에서 Alternate.master를 만들었으며 Alternate.master 세션 변수의 값에 따라 런타임에 Page 개체의 MasterPageFile 속성을 Site.master 또는 MyMasterPage로 설정 하는 코드를 BasePage 클래스에 작성 했습니다.Recall that we created Alternate.master in the preceding tutorial and wrote code in the BasePage class that set the Page object's MasterPageFile property at runtime to either Site.master or Alternate.master depending on the value of the MyMasterPage Session variable.

중첩 된 마스터 페이지를 적절 한 최상위 마스터 페이지를 사용 하도록 구성 하려면 어떻게 해야 하나요?How do we configure our nested master page so that it uses the appropriate top-level master page? 다음 두 가지 옵션이 있습니다.We have two options:

  • 두 개의 중첩 된 마스터 페이지, AdminNestedSite.masterAdminNestedAlternate.master을 만들고 최상위 마스터 페이지 Site.masterAlternate.master에 각각 바인딩합니다.Create two nested master pages, AdminNestedSite.master and AdminNestedAlternate.master, and bind them to the top-level master pages Site.master and Alternate.master, respectively. BasePage에서 Page 개체의 MasterPageFile를 적절 한 중첩 마스터 페이지로 설정 합니다.In BasePage, then, we'd set the Page object's MasterPageFile to the appropriate nested master page.
  • 단일 중첩 마스터 페이지를 만들고 콘텐츠 페이지에서이 특정 마스터 페이지를 사용 하도록 합니다.Create a single nested master page and have the content pages use this particular master page. 그런 다음 런타임에 중첩 된 마스터 페이지의 MasterPageFile 속성을 적절 한 최상위 마스터 페이지로 설정 해야 합니다.Then, at runtime, we'd need to set the nested master page's MasterPageFile property to the appropriate top-level master page at runtime. (지금까지 파악 했을 수 있으므로 마스터 페이지에도 MasterPageFile 속성이 있습니다.)(As you might have figured out by now, master pages also have a MasterPageFile property.)

두 번째 옵션을 사용 하겠습니다.Let's use the second option. AdminNested.master이라는 ~/Admin 폴더에 중첩 된 단일 마스터 페이지 파일을 만듭니다.Create a single nested master page file in the ~/Admin folder named AdminNested.master. Site.masterAlternate.master는 ContentPlaceHolder 컨트롤의 집합을 동일 하 게 유지 하기 때문에 사용자가 바인딩하는 마스터 페이지는 중요 하지 않지만 일관성을 위해 Site.master에 바인딩하는 것이 좋습니다.Because both Site.master and Alternate.master have the same set of ContentPlaceHolder controls, it doesn't matter what master page you bind it to, although I encourage you to bind it to Site.master for consistency's sake.

중첩 된 마스터 페이지를 ~/Admin 폴더에 추가 합니다.Add a Nested Master Page to the ~/Admin Folder.

그림 09: 중첩 된 마스터 페이지를 ~/Admin 폴더에 추가 합니다.Figure 09: Add a Nested Master Page to the ~/Admin Folder. (전체 크기 이미지를 보려면 클릭)(Click to view full-size image)

중첩 된 마스터 페이지는 네 개의 ContentPlaceHolder 컨트롤이 포함 된 마스터 페이지에 바인딩되기 때문에 Visual Studio에서는 네 개의 콘텐츠 컨트롤을 새 중첩 된 마스터 페이지 파일의 초기 태그에 추가 합니다.Because the nested master page is bound to a master page with four ContentPlaceHolder controls, Visual Studio adds four Content controls to the new nested master page file's initial markup. 2 단계와 3 단계에서와 같이 각 콘텐츠 컨트롤에 ContentPlaceHolder 컨트롤을 추가 하 여 최상위 마스터 페이지의 ContentPlaceHolder 컨트롤과 동일한 이름을 제공 합니다.Like we did in Steps 2 and 3, add a ContentPlaceHolder control in each Content control, giving it the same name as the top-level master page's ContentPlaceHolder control. 또한 MainContent ContentPlaceHolder에 해당 하는 콘텐츠 컨트롤에 다음 태그를 추가 합니다.Also add the following markup to the Content control that corresponds to the MainContent ContentPlaceHolder:

<div class="instructions"> 
 <b>Administration Instructions:</b>
 <br /> 
 The pages in the Administration section allow you, the Administrator, to 
 add new products and view existing products. 
</div>

그런 다음 Styles.cssAlternateStyles.css CSS 파일에 instructions CSS 클래스를 정의 합니다.Next, define the instructions CSS class in the Styles.css and AlternateStyles.css CSS files. 다음 CSS 규칙은 instructions 클래스를 사용 하 여 스타일을 지정 하는 HTML 요소가 밝은 노랑 배경색과 검정 실선 테두리와 함께 표시 되도록 합니다.The following CSS rules cause HTML elements styled with the instructions class to be displayed with a light yellow background color and a black, solid border:

.instructions 
{ 
 padding: 6px; 
 border: dashed 1px black; 
 background-color: #ffb; 
 margin-bottom: 10px; 
}

이 태그는 중첩 된 마스터 페이지에 추가 되었으므로이 중첩 된 마스터 페이지를 사용 하는 페이지 (즉, 관리 섹션의 페이지)에만 표시 됩니다.Because this markup has been added to the nested master page, it will only appear in those pages that use this nested master page (namely, the pages in the Administration section).

중첩 된 마스터 페이지를 추가 하 고 나면 해당 선언 태그는 다음과 유사 하 게 표시 됩니다.After making these additions to your nested master page, its declarative markup should look similar to the following:

<%@ Master Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="AdminNested.master.cs" Inherits="Admin_AdminNested" %> 
 <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
 <asp:ContentPlaceHolder ID="head" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content> 
 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server"> 
 <div class="instructions">
 <b>Administration Instructions:</b>
 <br /> 
 The pages in the Administration section allow you, the Administrator, to 
 add new products and view existing products. 
 </div> 
 <asp:ContentPlaceHolder ID="MainContent" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content> 
 <asp:Content ID="Content3" ContentPlaceHolderID="QuickLoginUI" Runat="Server"> 
 <asp:ContentPlaceHolder ID="QuickLoginUI" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content> 
 <asp:Content ID="Content4" ContentPlaceHolderID="LeftColumnContent" Runat="Server"> 
 <asp:ContentPlaceHolder ID="LeftColumnContent" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content>

각 콘텐츠 컨트롤에는 ContentPlaceHolder 컨트롤이 있으며 ContentPlaceHolder 컨트롤의 ID 속성에는 최상위 마스터 페이지의 해당 ContentPlaceHolder 컨트롤과 동일한 값이 할당 됩니다.Note that each Content control has a ContentPlaceHolder control and that the ContentPlaceHolder controls' ID properties are assigned the same values as the corresponding ContentPlaceHolder controls in the top-level master page. 또한 관리 섹션 관련 태그는 MainContent ContentPlaceHolder 표시 됩니다.Moreover, the Administration section-specific markup appears in the MainContent ContentPlaceHolder.

그림 10에는 Visual Studio의 디자이너를 통해 볼 때 중첩 된 마스터 페이지 AdminNested.master 표시 되어 있습니다.Figure 10 shows the AdminNested.master nested master page when viewed through Visual Studio's Designer. MainContent 콘텐츠 컨트롤의 맨 위에 있는 노란색 상자에서 지침을 확인할 수 있습니다.You can see the instructions in the yellow box at the top of the MainContent Content control.

중첩 된 마스터 페이지를 하 여 관리자에 대 한 지침을 포함 하도록 최상위 마스터 페이지를 확장 합니다.The Nested Master Page Extends the Top-Level Master Page to Include Instructions for the Administrator.

그림 10: 중첩 된 마스터 페이지는 관리자에 대 한 지침을 포함 하도록 최상위 마스터 페이지를 확장 합니다.Figure 10: The Nested Master Page Extends the Top-Level Master Page to Include Instructions for the Administrator. (전체 크기 이미지를 보려면 클릭)(Click to view full-size image)

5 단계: 새 중첩 된 마스터 페이지를 사용 하도록 기존 콘텐츠 페이지 업데이트Step 5: Updating the Existing Content Pages to Use the New Nested Master Page

새 콘텐츠 페이지를 관리 섹션에 추가할 때마다 방금 만든 AdminNested.master 마스터 페이지에 바인딩해야 합니다.Anytime we add a new content page to the Administration section we need to bind it to the AdminNested.master master page we just created. 그러나 기존 콘텐츠 페이지는 어떻습니까?But what about the existing content pages? 현재 사이트의 모든 콘텐츠 페이지는 BasePage 클래스에서 파생 되며 런타임에 프로그래밍 방식으로 콘텐츠 페이지의 마스터 페이지를 설정 합니다.Currently, all content pages in the site derive from the BasePage class, which programmatically sets the content page's master page at runtime. 이는 관리 섹션의 콘텐츠 페이지에 대해 원하는 동작이 아닙니다.This is not the behavior we want for the content pages in the Administration section. 대신 이러한 콘텐츠 페이지에서 항상 AdminNested.master 페이지를 사용 하려고 합니다.Instead, we want these content pages to always use the AdminNested.master page. 런타임에 오른쪽 최상위 콘텐츠 페이지를 선택 하는 것은 중첩 된 마스터 페이지의 책임입니다.It will be the responsibility of the nested master page to choose the right top-level content page at runtime.

이 원하는 동작을 수행 하는 가장 좋은 방법은 BasePage 클래스를 확장 하는 AdminBasePage 이라는 새로운 사용자 지정 기본 페이지 클래스를 만드는 것입니다.To best way to achieve this desired behavior is to create a new custom base page class named AdminBasePage that extends the BasePage class. 그런 다음 SetMasterPageFile를 재정의 하 고 Page 개체의 MasterPageFile를 하드 코드 된 값 "~/Admin/AdminNested.master"로 설정할 수 있습니다. AdminBasePageAdminBasePage can then override the SetMasterPageFile and set the Page object's MasterPageFile to the hard-coded value "~/Admin/AdminNested.master". 이러한 방식으로 AdminBasePage에서 파생 되는 모든 페이지는 AdminNested.master를 사용 하는 반면 BasePage에서 파생 되는 모든 페이지는 MyMasterPage 세션 변수의 값을 기반으로 하 여 MasterPageFile 속성을 "~/Site.master" 또는 "~/Alternate.master"로 동적으로 설정 합니다.In this way, any page that derives from AdminBasePage will use AdminNested.master, whereas any page that derives from BasePage will have its MasterPageFile property set dynamically to either "~/Site.master" or "~/Alternate.master" based on the value of the MyMasterPage Session variable.

AdminBasePage.cs이라는 App_Code 폴더에 새 클래스 파일을 추가 하 여 시작 합니다.Start by adding a new class file to the App_Code folder named AdminBasePage.cs. BasePage AdminBasePage 확장 한 다음 SetMasterPageFile 메서드를 재정의 합니다.Have AdminBasePage extend BasePage and then override the SetMasterPageFile method. 이 메서드에서 MasterPageFile "~/Admin/AdminNested.master" 값을 할당 합니다.In that method assign the MasterPageFile the value "~/Admin/AdminNested.master". 이러한 변경을 수행한 후 클래스 파일은 다음과 같이 표시 됩니다.After making these changes your class file should look similar to the following:

public class AdminBasePage : BasePage 
{ 
    protected override void SetMasterPageFile() 
    { 
        this.MasterPageFile = "~/Admin/AdminNested.master"; 
    } 
}

이제 관리 섹션의 기존 콘텐츠 페이지가 BasePage대신 AdminBasePage에서 파생 되어야 합니다.We now need to have the existing content pages in the Administration section derive from AdminBasePage instead of BasePage. ~/Admin 폴더의 각 콘텐츠 페이지에 대 한 코드를 사용 하는 클래스 파일로 이동 하 고이 변경 내용을 적용 합니다.Go to the code-behind class file for each content page in the ~/Admin folder and make this change. 예를 들어 ~/Admin/Default.aspx에서 코드 숨김이 클래스 선언을 다음과 같이 변경 합니다.For example, in ~/Admin/Default.aspx you'd change the code-behind class declaration from:

public partial class Admin_Default : BasePage

아래와 같이 변경합니다.To:

public partial class Admin_Default : AdminBasePage

그림 11에서는 최상위 마스터 페이지 (Site.master 또는 Alternate.master), 중첩 된 마스터 페이지 (AdminNested.master) 및 관리 섹션 콘텐츠 페이지가 서로 관련 되는 방법을 보여 줍니다.Figure 11 depicts how the top-level master page (Site.master or Alternate.master), the nested master page (AdminNested.master), and the Administration section content pages relate to one another.

중첩 된 마스터 페이지 관리 섹션의 페이지와 관련 된 콘텐츠를 정의 합니다.The Nested Master Page Defines Content Specific to the Pages in the Administration Section

그림 11: 중첩 된 마스터 페이지는 관리 섹션 (전체 크기 이미지를 보려면 클릭)의 페이지와 관련 된 콘텐츠를 정의 합니다.Figure 11: The Nested Master Page Defines Content Specific to the Pages in the Administration Section (Click to view full-size image)

6 단계: 마스터 페이지의 공용 메서드 및 속성 미러링Step 6: Mirroring the Master Page's Public Methods and Properties

~/Admin/AddProduct.aspx~/Admin/Products.aspx 페이지는 마스터 페이지와 프로그래밍 방식으로 상호 작용 합니다. ~/Admin/AddProduct.aspx는 마스터 페이지의 공용 RefreshRecentProductsGrid 메서드를 호출 하 고 해당 GridMessageText 속성을 설정 합니다. ~/Admin/Products.aspxPricesDoubled 이벤트에 대 한 이벤트 처리기가 있습니다.Recall that the ~/Admin/AddProduct.aspx and ~/Admin/Products.aspx pages interact programmatically with the master page: ~/Admin/AddProduct.aspx calls the master page's public RefreshRecentProductsGrid method and sets its GridMessageText property; ~/Admin/Products.aspx has an event handler for the PricesDoubled event. 이전 자습서에서는 이러한 public 멤버를 정의 하는 추상 BaseMasterPage 클래스를 만들었습니다.In the preceding tutorial we created an abstract BaseMasterPage class that defined these public members.

~/Admin/AddProduct.aspx~/Admin/Products.aspx 페이지에서는 해당 마스터 페이지가 BaseMasterPage 클래스에서 파생 되는 것으로 가정 합니다.The ~/Admin/AddProduct.aspx and ~/Admin/Products.aspx pages assume that their master page derives from the BaseMasterPage class. 그러나 AdminNested.master 페이지는 현재 System.Web.UI.MasterPage 클래스를 확장 합니다.The AdminNested.master page, however, currently extends the System.Web.UI.MasterPage class. 따라서 ~/Admin/Products.aspx 방문할 때 "' .asp ' 형식의 개체를 ' .asp. admin_adminnested_master ' 형식으로 ' BaseMasterPage ' 형식으로 캐스팅할 수 없습니다." 라는 메시지와 함께 InvalidCastException throw 됩니다.As a result, when visiting ~/Admin/Products.aspx an InvalidCastException is thrown with the message: "Unable to cast object of type 'ASP.admin_adminnested_master' to type 'BaseMasterPage'."

이 문제를 해결 하려면 AdminNested.master 코드 숨김이 BaseMasterPage를 확장 해야 합니다.To fix this we need to have the AdminNested.master code-behind class extend BaseMasterPage. 에서 중첩 된 마스터 페이지의 코드 숨김이 클래스 선언을 업데이트 합니다.Update the nested master page's code-behind class declaration from:

public partial class Admin_AdminNested : System.Web.UI.MasterPage

아래와 같이 변경합니다.To:

public partial class Admin_AdminNested : BaseMasterPage

아직 완료 되지 않았습니다.We're not done yet. BaseMasterPage 클래스는 추상적 이므로 abstract 멤버 RefreshRecentProductsGridGridMessageText를 재정의 해야 합니다.Because the BaseMasterPage class is abstract, we need to override the abstract members, RefreshRecentProductsGrid and GridMessageText. 이러한 멤버는 최상위 마스터 페이지에서 사용자 인터페이스를 업데이트 하는 데 사용 됩니다.These members are used by the top-level master pages to update their user interfaces. (실제로 Site.master 마스터 페이지는 이러한 메서드를 사용 하지만, 두 가지 모두를 BaseMasterPage확장 하므로 최상위 마스터 페이지는 이러한 메서드를 구현 합니다.)(Actually, only the Site.master master page uses these methods, although both top-level master pages implement these methods, since both extend BaseMasterPage.)

이러한 멤버는 AdminNested.master에서 구현 해야 하지만, 이러한 모든 구현은 중첩 된 마스터 페이지에서 사용 하는 최상위 마스터 페이지에서 동일한 멤버를 호출 하기만 하면 됩니다.While we need to implement these members in AdminNested.master, all these implementations need to do is simply call the same member in the top-level master page used by the nested master page. 예를 들어 관리 섹션의 콘텐츠 페이지에서 중첩 된 마스터 페이지의 RefreshRecentProductsGrid 메서드를 호출 하는 경우 모든 중첩 된 마스터 페이지는 그 다음에 Site.master 또는 Alternate.masterRefreshRecentProductsGrid 메서드를 호출 해야 합니다.For instance, when a content page in the Administration section calls the nested master page's RefreshRecentProductsGrid method, all the nested master page needs to do is, in turn, call Site.master or Alternate.master's RefreshRecentProductsGrid method.

이렇게 하려면 먼저 AdminNested.master맨 위에 다음 @MasterType 지시문을 추가 합니다.To achieve this, start by adding the following @MasterType directive to the top of AdminNested.master:

<%@ MasterType TypeName="BaseMasterPage" %>

@MasterType 지시문은 Master라는 코드를 만든 클래스에 강력한 형식의 속성을 추가 합니다.Recall that the @MasterType directive adds a strongly-typed property to the code-behind class named Master. 그런 다음 RefreshRecentProductsGridGridMessageText 멤버를 재정의 하 고 단순히 Master의 해당 메서드에 대 한 호출을 위임 합니다.Then override the RefreshRecentProductsGrid and GridMessageText members and simply delegate the call to the Master's corresponding method:

public partial class Admin_AdminNested : BaseMasterPage 
{ 
    public override void RefreshRecentProductsGrid() 
    { 
        Master.RefreshRecentProductsGrid();
    } 
    public override string GridMessageText
    { 
        get 
        {
            return Master.GridMessageText;
        } 
        set
        { 
            Master.GridMessageText = value; 
        } 
    }
}

이 코드가 준비 되 면 관리 섹션에서 콘텐츠 페이지를 방문 하 여 사용할 수 있어야 합니다.With this code in place, you should be able to visit and use the content pages in the Administration section. 그림 12는 브라우저를 통해 볼 때 ~/Admin/Products.aspx 페이지를 보여 줍니다.Figure 12 shows the ~/Admin/Products.aspx page when viewed through a browser. 여기에서 볼 수 있듯이 페이지에는 중첩 된 마스터 페이지에 정의 되어 있는 관리 지침 상자가 포함 되어 있습니다.As you can see, the page includes the Administration Instructions box, which is defined in the nested master page.

관리 섹션의 콘텐츠 페이지 각 페이지의 맨 위에 지침이 포함 되어 있습니다.The Content Pages in the Administration Section Include Instructions at the Top of Each Page

그림 12: 관리 섹션의 콘텐츠 페이지에는 각 페이지의 맨 위에 있는 지침이 포함 됩니다 (전체 크기 이미지를 보려면 클릭).Figure 12: The Content Pages in the Administration Section Include Instructions at the Top of Each Page (Click to view full-size image)

7 단계: 런타임에 적절 한 최상위 마스터 페이지 사용Step 7: Using the Appropriate Top-Level Master Page at Runtime

관리 섹션의 모든 콘텐츠 페이지가 완전히 작동 하지만 모두 동일한 최상위 마스터 페이지를 사용 하 고 ChooseMasterPage.aspx에서 사용자가 선택한 마스터 페이지를 무시 합니다.While all the content pages in the Administration section are fully functional, they all use the same top-level master page and ignore the master page selected by the user at ChooseMasterPage.aspx. 이 동작은 중첩 된 마스터 페이지의 <%@ Master %> 지시문에 Site.master 정적으로 설정 된 MasterPageFile 속성이 있으므로 발생 합니다.This behavior is due to the fact that the nested master page has its MasterPageFile property statically set to Site.master in its <%@ Master %> directive.

최종 사용자가 선택한 최상위 마스터 페이지를 사용 하려면 AdminNested.masterMasterPageFile 속성을 MyMasterPage 세션 변수의 값으로 설정 해야 합니다.To use the top-level master page selected by the end user we need to set the AdminNested.master's MasterPageFile property to the value in the MyMasterPage Session variable. BasePage에서 콘텐츠 페이지의 MasterPageFile 속성을 설정 하므로 BaseMasterPage 또는 AdminNested.master의 코드 숨김이 클래스에서 중첩 된 마스터 페이지의 MasterPageFile 속성을 설정 하는 것으로 생각할 수 있습니다.Because we set the content pages' MasterPageFile properties in BasePage, you may think that we would set the nested master page's MasterPageFile property in BaseMasterPage or in the AdminNested.master's code-behind class. 그러나이는 PreInit 단계의 끝에 MasterPageFile 속성을 설정 해야 하기 때문에 작동 하지 않습니다.This won't work, however, because we need to have set the MasterPageFile property by the end of the PreInit stage. 마스터 페이지에서 페이지 수명 주기를 프로그래밍 방식으로 탭 할 수 있는 가장 빠른 시간은 Init 단계 (PreInit 단계 이후에 발생)입니다.The earliest time that we can programmatically tap into the page lifecycle from a master page is the Init stage (which occurs after the PreInit stage).

따라서 콘텐츠 페이지에서 중첩 된 마스터 페이지의 MasterPageFile 속성을 설정 해야 합니다.Therefore, we need to set the nested master page's MasterPageFile property from the content pages. AdminNested.master 마스터 페이지를 사용 하는 콘텐츠 페이지는 AdminBasePage에서 파생 됩니다.The only content pages that use the AdminNested.master master page derive from AdminBasePage. 따라서 여기에이 논리를 추가할 수 있습니다.Therefore, we can put this logic there. 5 단계에서는 SetMasterPageFile 메서드를 제거 하 여 Page 개체의 MasterPageFile 속성을 "~/Admin/AdminNested.master"로 설정 합니다.In Step 5 we overrode the SetMasterPageFile method, setting the Page object's MasterPageFile property to "~/Admin/AdminNested.master". 또한 SetMasterPageFile 업데이트 하 여 마스터 페이지의 MasterPageFile 속성을 세션에 저장 된 결과로 설정 합니다.Update SetMasterPageFile to also set the master page's MasterPageFile property to the result stored in Session:

public class AdminBasePage : BasePage 
{ 
    protected override void SetMasterPageFile() 
    { 
        this.MasterPageFile = "~/Admin/AdminNested.master"; 
        Page.Master.MasterPageFile = base.GetMasterPageFileFromSession(); 
    } 
}

이전 자습서에서 BasePage 클래스에 추가한 GetMasterPageFileFromSession 메서드는 세션 변수 값에 따라 적절 한 마스터 페이지 파일 경로를 반환 합니다.The GetMasterPageFileFromSession method, which we added to the BasePage class in the preceding tutorial, returns the appropriate master page file path based on the Session variable value.

이와 같이 변경 하면 사용자의 마스터 페이지 선택이 관리 섹션으로 전달 됩니다.With this change in place, the user's master page selection carries over to the Administration section. 그림 13에는 그림 12와 동일한 페이지가 표시 되지만 사용자가 마스터 페이지 선택을 변경한 후에는 Alternate.master합니다.Figure 13 shows the same page as Figure 12, but after the user has changed their master page selection to Alternate.master.

중첩 된 관리 페이지 사용자가 선택한 최상위 마스터 페이지 사용The Nested Administration Page Uses the Top-Level Master Page Selected by the User

그림 13: 중첩 된 관리 페이지에서 사용자가 선택한 최상위 마스터 페이지 사용 (전체 크기 이미지를 보려면 클릭)Figure 13: The Nested Administration Page Uses the Top-Level Master Page Selected by the User (Click to view full-size image)

요약Summary

콘텐츠 페이지를 마스터 페이지에 바인딩하는 방법과 마찬가지로 자식 마스터 페이지를 부모 마스터 페이지에 바인딩하기 때문에 중첩 된 마스터 페이지를 만들 수 있습니다.Much like how content pages can bind to a master page, it is possible to create nested master pages by having a child master page bind to a parent master page. 자식 마스터 페이지는 각 부모의 ContentPlaceHolders 표시자에 대 한 콘텐츠 컨트롤을 정의할 수 있습니다. 그런 다음 이러한 콘텐츠 컨트롤에 자체 ContentPlaceHolder 컨트롤 및 기타 태그를 추가할 수 있습니다.The child master page may define Content controls for each of its parent's ContentPlaceHolders; it can then add its own ContentPlaceHolder controls (as well as other markup) to these Content controls. 중첩 된 마스터 페이지는 모든 페이지에서 중요 한 모양과 느낌을 공유 하는 많은 웹 응용 프로그램에서 매우 유용 하지만 사이트의 특정 섹션에는 고유한 사용자 지정이 필요 합니다.Nested master pages are quite useful in large web applications where all pages share an overarching look and feel, yet certain sections of the site require unique customizations.

행복 한 프로그래밍Happy Programming!

추가 참고 자료Further Reading

이 자습서에서 설명 하는 항목에 대 한 자세한 내용은 다음 리소스를 참조 하세요.For more information on the topics discussed in this tutorial, refer to the following resources:

저자 정보About the Author

Scott Mitchell는 여러 ASP/ASP. NET books의 작성자와 4GuysFromRolla.com의 창립자가 1998부터 Microsoft 웹 기술을 사용 하 여 작업 했습니다.Scott Mitchell, author of multiple ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott은 독립 컨설턴트, 강사 및 기록기로 작동 합니다.Scott works as an independent consultant, trainer, and writer. 최신 책은 24 시간 이내에 ASP.NET 3.5을 sams teach yourself것입니다.His latest book is Sams Teach Yourself ASP.NET 3.5 in 24 Hours. Scott은 mitchell@4GuysFromRolla.com 또는 http://ScottOnWriting.NET의 블로그를 통해 연결할 수 있습니다.Scott can be reached at mitchell@4GuysFromRolla.com or via his blog at http://ScottOnWriting.NET.

특별히 감사 합니다.Special Thanks To

이 자습서 시리즈는 많은 유용한 검토자가 검토 했습니다.This tutorial series was reviewed by many helpful reviewers. 예정 된 MSDN 문서를 검토 하는 데 관심이 있나요?Interested in reviewing my upcoming MSDN articles? 그렇다면 mitchell@4GuysFromRolla.com 에 줄을 놓습니다.If so, drop me a line at mitchell@4GuysFromRolla.com