다음을 통해 공유


콘텐츠 페이지에서 마스터 페이지와 상호 작용(C#)

스콧 미첼

콘텐츠 페이지의 코드에서 마스터 페이지의 메서드를 호출하고 속성을 설정하는 방법을 검사합니다.

소개

지난 5개의 자습서를 통해 마스터 페이지를 만들고, 콘텐츠 영역을 정의하고, ASP.NET 페이지를 마스터 페이지에 바인딩하고, 페이지별 콘텐츠를 정의하는 방법을 살펴보았습니다. 방문자가 특정 콘텐츠 페이지를 요청하면 런타임에 콘텐츠 및 마스터 페이지의 태그가 융합되어 통합 컨트롤 계층 구조가 렌더링됩니다. 따라서 마스터 페이지와 해당 콘텐츠 페이지 중 하나가 상호 작용할 수 있는 한 가지 방법이 이미 있습니다. 콘텐츠 페이지는 태그를 철자하여 마스터 페이지의 ContentPlaceHolder 컨트롤로 변환합니다.

아직 검사하지 않은 것은 마스터 페이지와 콘텐츠 페이지가 프로그래밍 방식으로 상호 작용하는 방법입니다. 콘텐츠 페이지는 마스터 페이지의 ContentPlaceHolder 컨트롤에 대한 태그를 정의하는 것 외에도 마스터 페이지의 공용 속성에 값을 할당하고 공용 메서드를 호출할 수도 있습니다. 마찬가지로 마스터 페이지는 해당 콘텐츠 페이지와 상호 작용할 수 있습니다. 마스터 페이지와 콘텐츠 페이지 간의 프로그래밍 방식 상호 작용은 선언적 태그 간의 상호 작용보다 덜 일반적이지만 이러한 프로그래밍 방식 상호 작용이 필요한 많은 시나리오가 있습니다.

이 자습서에서는 콘텐츠 페이지가 마스터 페이지와 프로그래밍 방식으로 상호 작용하는 방법을 검토합니다. 다음 자습서에서는 마스터 페이지가 콘텐츠 페이지와 유사하게 상호 작용하는 방법을 살펴보겠습니다.

콘텐츠 페이지와 해당 마스터 페이지 간의 프로그래밍 방식 상호 작용 예제

페이지의 특정 영역을 페이지 단위로 구성해야 하는 경우 ContentPlaceHolder 컨트롤을 사용합니다. 그러나 대부분의 페이지가 특정 출력을 내보내야 하지만 적은 수의 페이지가 다른 것을 표시하기 위해 사용자 지정해야 하는 상황은 어떨까요? 다중 ContentPlaceHolders 및 기본 콘텐츠 자습서에서 검사한 이러한 예제 중 하나는 각 페이지에 로그인 인터페이스를 표시하는 것입니다. 대부분의 페이지에는 로그인 인터페이스가 포함되어야 하지만, 기본 로그인 페이지(Login.aspx), 계정 만들기 페이지 및 인증된 사용자만 액세스할 수 있는 기타 페이지와 같은 소수의 페이지에 대해서는 이 인터페이스를 표시하지 않아야 합니다. 다중 ContentPlaceHolders 및 기본 콘텐츠 자습서에서는 마스터 페이지에서 ContentPlaceHolder에 대한 기본 콘텐츠를 정의한 다음 기본 콘텐츠가 원하지 않는 페이지에서 재정의하는 방법을 보여 줬습니다.

또 다른 옵션은 로그인 인터페이스를 표시하거나 숨길지 여부를 나타내는 마스터 페이지 내에 공용 속성 또는 메서드를 만드는 것입니다. 예를 들어 마스터 페이지에는 해당 값이 마스터 페이지에서 로그인 컨트롤의 속성을 설정하는 Visible 데 사용된 공용 ShowLoginUI 속성이 포함될 수 있습니다. 로그인 사용자 인터페이스를 표시하지 않아야 하는 콘텐츠 페이지는 프로그래밍 방식으로 속성을 false으로 설정할 ShowLoginUI 수 있습니다.

아마도 콘텐츠 및 마스터 페이지 상호 작용의 가장 일반적인 예는 일부 작업이 콘텐츠 페이지에서 발생한 후 마스터 페이지에 표시된 데이터를 새로 고쳐야 할 때 발생합니다. 특정 데이터베이스 테이블에서 가장 최근에 추가된 5개의 레코드를 표시하는 GridView를 포함하고 해당 콘텐츠 페이지 중 하나에 동일한 테이블에 새 레코드를 추가하기 위한 인터페이스가 포함된 마스터 페이지를 고려합니다.

사용자가 페이지를 방문하여 새 레코드를 추가하면 마스터 페이지에 가장 최근에 추가된 5개의 레코드가 표시됩니다. 새 레코드의 열 값을 입력한 후 양식을 제출합니다. 마스터 페이지의 GridView에 해당 EnableViewState 속성이 true(기본값)로 설정되어 있다고 가정하면 해당 콘텐츠가 뷰 상태에서 다시 로드되므로 데이터베이스에 최신 레코드가 추가된 경우에도 동일한 레코드 5개가 표시됩니다. 이렇게 하면 사용자가 혼동을 하게 될 수 있습니다.

참고 항목

모든 포스트백에서 기본 데이터 원본으로 다시 바인딩되도록 GridView의 뷰 상태를 사용하지 않도록 설정하더라도 데이터가 데이터베이스에 새 레코드가 추가될 때보다 페이지 수명 주기의 앞부분에서 GridView에 바인딩되므로 방금 추가된 레코드는 표시되지 않습니다.

방금 추가된 레코드가 포스트백의 마스터 페이지의 GridView에 표시되도록 이 문제를 해결하려면 데이터베이스에 새 레코드가 추가된 후 GridView에 데이터 원본으로 다시 바인딩하도록 지시해야 합니다. 새 레코드(및 해당 이벤트 처리기)를 추가하기 위한 인터페이스가 콘텐츠 페이지에 있지만 새로 고쳐야 하는 GridView는 마스터 페이지에 있으므로 콘텐츠와 마스터 페이지 간의 상호 작용이 필요합니다.

콘텐츠 페이지의 이벤트 처리기에서 마스터 페이지의 표시를 새로 고치는 것은 콘텐츠 및 마스터 페이지 상호 작용에 대한 가장 일반적인 요구 사항 중 하나이므로 이 항목을 좀 더 자세히 살펴보겠습니다. 이 자습서의 다운로드에는 웹 사이트의 App_Data 폴더에 이름이 지정된 NORTHWIND.MDF Microsoft SQL Server 2005 Express Edition 데이터베이스가 포함되어 있습니다. Northwind 데이터베이스는 가상의 회사인 Northwind Traders의 제품, 직원 및 판매 정보를 저장합니다.

1단계에서는 마스터 페이지의 GridView에 가장 최근에 추가된 5개의 제품을 표시하는 단계를 안내합니다. 2단계에서는 새 제품을 추가하기 위한 콘텐츠 페이지를 만듭니다. 3단계에서는 마스터 페이지에서 공용 속성 및 메서드를 만드는 방법을 살펴보고, 4단계에서는 콘텐츠 페이지에서 이러한 속성 및 메서드를 프로그래밍 방식으로 인터페이스하는 방법을 보여 줍니다.

참고 항목

이 자습서에서는 ASP.NET 데이터 작업의 세부 사항을 자세히 살펴보지 않습니다. 데이터를 표시하도록 마스터 페이지를 설정하고 데이터를 삽입하기 위한 콘텐츠 페이지를 설정하는 단계는 완료되지만 산들바람이 부는 단계입니다. 데이터를 표시 및 삽입하고 SqlDataSource 및 GridView 컨트롤을 사용하는 방법에 대한 자세한 내용은 이 자습서의 끝에 있는 추가 읽기 섹션의 리소스를 참조하세요.

1단계: 마스터 페이지에 가장 최근에 추가된 제품 5개 표시

Site.master 마스터 페이지를 열고 레이블 및 GridView 컨트롤 leftContent <div>을 에 추가합니다. Label의 Text 속성을 지우고, 해당 EnableViewState 속성을 false로 설정하고, 해당 ID 속성을 GridMessage/>로 설정하고 GridView의 ID 속성을 .로 RecentProducts설정합니다. 그런 다음 디자이너에서 GridView의 스마트 태그를 확장하고 새 데이터 원본에 바인딩하도록 선택합니다. 그러면 데이터 원본 구성 마법사가 시작됩니다. 폴더의 Northwind 데이터베이스 App_Data 는 Microsoft SQL Server 데이터베이스이므로 선택하여 SqlDataSource를 만들도록 선택합니다(그림 1 참조). SqlDataSource RecentProductsDataSource의 이름을 지정합니다.

RecentProductsDataSource라는 SqlDataSource 컨트롤에 GridView 바인딩

그림 01: GridView를 명명된 RecentProductsDataSource SqlDataSource 컨트롤에 바인딩(전체 크기 이미지를 보려면 클릭)

다음 단계에서는 연결할 데이터베이스를 지정하도록 요청합니다. NORTHWIND.MDF 드롭다운 목록에서 데이터베이스 파일을 선택하고 다음을 클릭합니다. 이 데이터베이스를 처음 사용했으므로 마법사는 연결 문자열 Web.config저장하도록 제공합니다. 이름을 사용하여 연결 문자열 저장해야 합니다NorthwindConnectionString.

Northwind 데이터베이스에 연결

그림 02: Northwind 데이터베이스에 연결(전체 크기 이미지를 보려면 클릭)

데이터 원본 구성 마법사는 데이터를 검색하는 데 사용되는 쿼리를 지정할 수 있는 두 가지 방법을 제공합니다.

  • 사용자 지정 SQL 문 또는 저장 프로시저를 지정하거나
  • 테이블 또는 뷰를 선택한 다음 반환할 열을 지정합니다.

가장 최근에 추가된 5개의 제품만 반환하려고 하므로 사용자 지정 SQL 문을 지정해야 합니다. 다음 SELECT 쿼리를 사용합니다.

SELECT TOP 5 ProductName, UnitPrice FROM Products ORDER BY ProductID DESC

키워드는 TOP 5 쿼리에서 처음 5개의 레코드만 반환합니다. Products 테이블의 기본 키ProductID인 열은 IDENTITY 테이블에 추가된 각 새 제품이 이전 항목보다 더 큰 값을 가지도록 보장하는 열입니다. 따라서 결과를 내림차순으로 ProductID 정렬하면 가장 최근에 만든 제품부터 시작하는 제품이 반환됩니다.

가장 최근에 추가된 5개 제품 반환

그림 03: 가장 최근에 추가된 5개 제품 반환(전체 크기 이미지를 보려면 클릭)

마법사를 완료한 후 Visual Studio는 GridView에 대해 두 개의 BoundFields를 생성하여 데이터베이스에서 반환된 ProductName 필드와 UnitPrice 해당 필드를 표시합니다. 이 시점에서 마스터 페이지의 선언적 태그는 다음과 유사한 태그를 포함해야 합니다.

<asp:Label ID="GridMessage" runat="server" EnableViewState="false"></asp:Label>
<asp:GridView ID="RecentProducts" runat="server" AutoGenerateColumns="False"
 DataSourceID="RecentProductsDataSource">
 <Columns> 
 <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
 SortExpression="ProductName"/> 
 <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
 SortExpression="UnitPrice"/> 
 </Columns> 
</asp:GridView> 

<asp:SqlDataSource ID="RecentProductsDataSource" runat="server" 
 ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
 SelectCommand="SELECT TOP 5 ProductName, UnitPrice FROM Products ORDER BY ProductID DESC"> 
</asp:SqlDataSource>

볼 수 있듯이 태그에는 레이블 웹 컨트롤(GridMessage); GridView RecentProducts, 2개의 BoundFields, 그리고 가장 최근에 추가된 5개의 제품을 반환하는 SqlDataSource 컨트롤이 포함됩니다.

이 GridView가 만들어지고 SqlDataSource 컨트롤이 구성되면 브라우저를 통해 웹 사이트를 방문합니다. 그림 4와 같이 가장 최근에 추가된 5개의 제품을 나열하는 표가 왼쪽 아래 모서리에 표시됩니다.

GridView는 가장 최근에 추가된 5개의 제품을 표시합니다.

그림 04: GridView에 가장 최근에 추가된 5개 제품이 표시됩니다(전체 크기 이미지를 보려면 클릭).

참고 항목

GridView의 모양을 자유롭게 정리하세요. 표시되는 값의 UnitPrice 서식을 통화로 지정하고 배경색과 글꼴을 사용하여 표의 모양을 개선하는 제안도 있습니다.

2단계: 새 제품을 추가하는 콘텐츠 페이지 만들기

다음 작업은 사용자가 테이블에 새 제품을 추가할 수 있는 콘텐츠 페이지를 만드는 것입니다 Products . 새 콘텐츠 페이지를 폴더에 Admin AddProduct.aspx추가하여 마스터 페이지에 바인딩해야 합니다 Site.master . 그림 5는 이 페이지가 웹 사이트에 추가된 후의 솔루션 탐색기 보여줍니다.

관리자 폴더에 새 ASP.NET 페이지 추가

그림 05: 폴더에 Admin 새 ASP.NET 페이지 추가(전체 크기 이미지를 보려면 클릭)

마스터 페이지 자습서의 제목, 메타 태그 및 기타 HTML 헤더 지정 자습서에서 명시적으로 설정되지 않은 경우 페이지 제목을 생성하는 사용자 BasePage 지정 기본 페이지 클래스를 만들었습니다. AddProduct.aspx 페이지의 코드 숨김 클래스로 이동하여 이 클래스 BasePage 가 파생되도록 합니다(원본이 아닌System.Web.UI.Page).

마지막으로 이 단원의 Web.sitemap 항목을 포함하도록 파일을 업데이트합니다. 컨트롤 ID 명명 문제 단원 아래에 <siteMapNode> 다음 태그를 추가합니다.

<siteMapNode url="~/Admin/AddProduct.aspx" title="Content to Master Page Interaction" />

그림 6에 표시된 것처럼 이 <siteMapNode> 요소의 추가는 단원 목록에 반영됩니다.

로 돌아갑니다 AddProduct.aspx. ContentPlaceHolder에 MainContent 대한 콘텐츠 컨트롤에서 DetailsView 컨트롤을 추가하고 이름을 지정합니다 NewProduct. DetailsView를 명명 NewProductDataSource된 새 SqlDataSource 컨트롤에 바인딩합니다. 1단계의 SqlDataSource와 마찬가지로 Northwind 데이터베이스를 사용하도록 마법사를 구성하고 사용자 지정 SQL 문을 지정하도록 선택합니다. DetailsView는 데이터베이스에 항목을 추가하는 데 사용되므로 문과 INSERT 문을 모두 SELECT 지정해야 합니다. 다음 쿼리를 사용합니다.SELECT

SELECT ProductName, UnitPrice FROM Products

그런 다음 INSERT 탭에서 다음 INSERT 문을 추가합니다.

INSERT INTO Products(ProductName, UnitPrice) VALUES(@ProductName, @UnitPrice)

마법사를 완료한 후 DetailsView의 스마트 태그로 이동하여 "삽입 사용" 확인란을 선택합니다. 그러면 해당 속성이 true로 설정된 DetailsView에 CommandField가 ShowInsertButton 추가됩니다. 이 DetailsView는 데이터를 삽입하는 데만 사용되므로 DetailsView의 DefaultMode 속성을 Insert.로 설정합니다.

이것이 전부입니다! 이 페이지를 테스트해 보겠습니다. 브라우저를 통해 방문하여 AddProduct.aspx 이름과 가격을 입력합니다(그림 6 참조).

데이터베이스에 새 제품 추가

그림 06: 데이터베이스에 새 제품 추가(전체 크기 이미지를 보려면 클릭)

새 제품의 이름과 가격을 입력한 후 삽입 단추를 클릭합니다. 이렇게 하면 폼이 포스트백됩니다. 포스트백 시 SqlDataSource 컨트롤의 INSERT 문이 실행됩니다. 두 매개 변수는 DetailsView의 두 TextBox 컨트롤에서 사용자가 입력한 값으로 채워집니다. 아쉽게도 삽입이 발생했다는 시각적 피드백은 없습니다. 새 레코드가 추가되었음을 확인하는 메시지를 표시하는 것이 좋습니다. 나는 이것을 독자를위한 운동으로 둡니다. 또한 DetailsView에서 새 레코드를 추가한 후에도 마스터 페이지의 GridView는 이전과 동일한 5개의 레코드를 표시합니다. 방금 추가한 레코드는 포함되지 않습니다. 향후 단계에서 이 문제를 해결하는 방법을 살펴보겠습니다.

참고 항목

삽입에 성공했다는 시각적 피드백의 일부 형태를 추가하는 것 외에도 유효성 검사를 포함하도록 DetailsView의 삽입 인터페이스를 업데이트하는 것이 좋습니다. 현재 유효성 검사가 없습니다. 사용자가 필드에 잘못된 값 UnitPrice (예: "너무 비싸다")을 입력하면 시스템에서 해당 문자열을 10진수로 변환하려고 할 때 포스트백에 예외가 throw됩니다. 삽입 인터페이스 사용자 지정에 대한 자세한 내용은 데이터 작업 자습서 시리즈의 데이터 수정 인터페이스 사용자 지정 자습서를 참조하세요.

3단계: 마스터 페이지에서 공용 속성 및 메서드 만들기

1단계에서는 마스터 페이지의 GridView 위에 레이블 GridMessage 웹 컨트롤을 추가했습니다. 이 레이블은 필요에 따라 메시지를 표시하기 위한 것입니다. 예를 들어 테이블에 새 레코드를 Products 추가한 후 "ProductName 이 데이터베이스에 추가되었습니다."라는 메시지를 표시할 수 있습니다. 마스터 페이지에서 이 레이블의 텍스트를 하드 코딩하는 대신 콘텐츠 페이지에서 메시지를 사용자 지정할 수 있습니다.

레이블 컨트롤은 마스터 페이지 내에서 보호된 멤버 변수로 구현되므로 콘텐츠 페이지에서 직접 액세스할 수 없습니다. 콘텐츠 페이지(또는 마스터 페이지의 모든 웹 컨트롤)에서 마스터 페이지 내에서 레이블을 사용하려면 마스터 페이지에서 웹 컨트롤을 노출하거나 해당 속성 중 하나에 액세스할 수 있는 프록시 역할을 하는 공용 속성을 만들어야 합니다. 마스터 페이지의 코드 숨김 클래스에 다음 구문을 추가하여 Label의 Text 속성을 노출합니다.

public string GridMessageText 
{ 
    get
    { 
        return GridMessage.Text; 
    } 
    set 
    {
        GridMessage.Text = value; 
    }
}

콘텐츠 페이지에서 테이블에 새 레코드를 Products 추가하면 마스터 페이지의 RecentProducts GridView가 기본 데이터 원본으로 다시 바인딩되어야 합니다. GridView를 다시 바인딩하려면 해당 메서드를 호출합니다 DataBind . 마스터 페이지의 GridView는 콘텐츠 페이지에서 프로그래밍 방식으로 액세스할 수 없으므로 호출될 때 GridView에 데이터를 다시 바인딩하는 공용 메서드를 마스터 페이지에 만들어야 합니다. 마스터 페이지의 코드 숨김 클래스에 다음 메서드를 추가합니다.

public void RefreshRecentProductsGrid() 
{ 
    RecentProducts.DataBind();
}

속성 및 메서드를 GridMessageText 사용하면 모든 콘텐츠 페이지에서 프로그래밍 방식으로 레이블 Text 속성 값을 GridMessage 설정하거나 읽거나 GridView에 데이터를 다시 바인딩할 RecentProductsRefreshRecentProductsGrid 있습니다. 4단계에서는 콘텐츠 페이지에서 마스터 페이지의 공용 속성 및 메서드에 액세스하는 방법을 살펴봅니다.

참고 항목

마스터 페이지의 속성과 메서드를 .로 public표시하는 것을 잊지 마세요. 이러한 속성과 메서드 public를 명시적으로 나타내지 않으면 콘텐츠 페이지에서 액세스할 수 없습니다.

4단계: 콘텐츠 페이지에서 마스터 페이지의 공개 구성원 호출

이제 마스터 페이지에 필요한 공용 속성과 메서드가 있으므로 콘텐츠 페이지에서 이러한 속성과 메서드를 AddProduct.aspx 호출할 준비가 되었습니다. 특히 새 제품이 데이터베이스에 추가된 후 마스터 페이지의 GridMessageText 속성을 설정하고 메서드 RefreshRecentProductsGrid 를 호출해야 합니다. 모든 ASP.NET 데이터 웹 컨트롤은 다양한 작업을 완료하기 직전과 후에 이벤트를 실행하므로 페이지 개발자가 작업 전후에 프로그래밍 방식으로 작업을 쉽게 수행할 수 있습니다. 예를 들어 최종 사용자가 DetailsView의 삽입 단추를 클릭하면 포스트백 시 DetailsView는 삽입 워크플로를 시작하기 전에 이벤트를 발생합니다 ItemInserting . 그런 다음 데이터베이스에 레코드를 삽입합니다. 그런 다음 DetailsView가 이벤트를 발생합니다 ItemInserted . 따라서 새 제품이 추가된 후 마스터 페이지를 사용하려면 DetailsView 이벤트에 ItemInserted 대한 이벤트 처리기를 만듭니다.

콘텐츠 페이지가 마스터 페이지와 프로그래밍 방식으로 인터페이스할 수 있는 두 가지 방법이 있습니다.

  • Page.Master 마스터 페이지에 대해 느슨하게 형식화된 참조를 반환하는 속성 사용 또는
  • 지시문을 통해 @MasterType 페이지의 마스터 페이지 형식 또는 파일 경로를 지정합니다. 그러면 강력한 형식의 속성이 이름이 지정된 Master페이지에 자동으로 추가됩니다.

두 방법을 모두 살펴보겠습니다.

느슨하게 형식화된Page.Master속성 사용

모든 ASP.NET 웹 페이지는 네임스페이 Page 스에 있는 클래스에서 System.Web.UI 파생되어야 합니다. 클래스에는 Page 페이지의 마스터 페이지에 대한 참조를 반환하는 속성이 포함됩니다Master. 페이지에 마스터 페이지 Master 가 없으면 .null

이 속성은 Master 모든 마스터 페이지가 파생되는 기본 형식인 형식 MasterPage (네임스페이스에도 있음 System.Web.UI )의 개체를 반환합니다. 따라서 웹 사이트의 마스터 페이지에 정의된 공용 속성 또는 메서드를 사용하려면 속성에서 Master 반환된 MasterPage 개체를 적절한 형식으로 캐스팅해야 합니다. 마스터 페이지 파일 Site.master의 이름을 지정했으므로 코드 숨김 클래스의 이름이 지정 Site되었습니다. 따라서 다음 코드는 속성을 Site 클래스의 인스턴스로 캐스팅합니다 Page.Master .

// Cast the loosely-typed Page.Master property and then set the GridMessageText property 
Site myMasterPage = Page.Master as Site;

이제 느슨하게 형식화된 Page.Master 속성을 Site와 관련된 속성 및 메서드를 Site 참조할 수 있는 형식으로 캐스팅했습니다. 그림 7에서 알 수 있듯이 공용 속성 GridMessageText 은 IntelliSense 드롭다운에 표시됩니다.

마스터 페이지의 공용 속성 및 메서드를 보여 주는 IntelliSense

그림 07: IntelliSense는 마스터 페이지의 공용 속성 및 메서드를 보여 줍니다(전체 크기 이미지를 보려면 클릭).

참고 항목

마스터 페이지 파일 MasterPage.master 의 이름을 지정한 경우 마스터 페이지의 코드 숨김 클래스 이름은 다음과 입니다 MasterPage. 이렇게 하면 형식 System.Web.UI.MasterPage 에서 클래스로 캐스팅할 때 모호한 코드가 발생할 수 있습니다 MasterPage . 요컨대, 웹 사이트 프로젝트 모델을 사용할 때 약간 까다로울 수 있는 캐스팅 형식을 완전히 정규화해야 합니다. 내 제안은 마스터 페이지를 만들 때 이름을 다른 MasterPage.master 이름으로 지정하거나 마스터 페이지에 대한 강력한 형식의 참조를 만드는 것입니다.

지시문을 사용하여 강력한 형식의 참조@MasterType만들기

자세히 살펴보면 ASP.NET 페이지의 코드 숨김 클래스가 부분 클래스임을 알 수 있습니다(클래스 정의의 partial 키워드 참고). 부분 클래스는 C# 및 Visual Basic with.NET Framework 2.0에서 도입되었으며, 간단히 말해서 여러 파일에서 클래스의 멤버를 정의할 수 있습니다. 예를 들어 코드 숨김 클래스 파일에 AddProduct.aspx.cs는 페이지 개발자가 만드는 코드가 포함되어 있습니다. 코드 외에도 ASP.NET 엔진은 선언적 태그를 페이지의 클래스 계층으로 변환하는 속성 및 이벤트 처리기가 있는 별도의 클래스 파일을 자동으로 만듭니다.

ASP.NET 페이지를 방문할 때마다 발생하는 자동 코드 생성은 다소 흥미롭고 유용한 가능성을 제공합니다. 마스터 페이지의 경우 콘텐츠 페이지에서 사용 중인 마스터 페이지를 ASP.NET 엔진에 알려면 강력한 형식 Master 의 속성이 생성됩니다.

지시문을 @MasterType 사용하여 콘텐츠 페이지의 마스터 페이지 형식을 ASP.NET 엔진에 알릴 수 있습니다. 지시문은 @MasterType 마스터 페이지의 형식 이름 또는 해당 파일 경로를 수락할 수 있습니다. 페이지가 AddProduct.aspx 마스터 페이지로 사용하도록 Site.master 지정하려면 다음 지시문을 맨 위에 AddProduct.aspx추가합니다.

<%@ MasterType VirtualPath="~/Site.master" %>

이 지시문은 ASP.NET 엔진에 명명 Master된 속성을 통해 마스터 페이지에 강력한 형식의 참조를 추가하도록 지시합니다. 지시문을 @MasterType 사용하면 캐스트 없이 속성을 통해 직접 마스터 페이지의 공용 속성 및 메서드를 Master 호출 Site.master 할 수 있습니다.

참고 항목

지시문을 생략 @MasterType 하면 구문 Page.MasterMaster 동일한 항목인 느슨한 형식의 개체를 페이지의 마스터 페이지로 반환합니다. 지시문을 @MasterType Master 포함하는 경우 지정된 마스터 페이지에 강력한 형식의 참조를 반환합니다. Page.Master그러나 느슨한 형식의 참조는 여전히 반환됩니다. 이 경우인 이유와 지시문이 포함될 때 @MasterType 속성이 생성되는 방법에 Master 대한 자세한 내용은 ASP.NET 2.0에서 K. Scott Allen의 블로그 항목을@MasterType 참조하세요.

새 제품을 추가한 후 마스터 페이지 업데이트

이제 콘텐츠 페이지에서 마스터 페이지의 공용 속성 및 메서드를 호출하는 방법을 알게 되었으므로 새 제품을 추가한 후 마스터 페이지가 새로 고쳐지도록 페이지를 업데이트 AddProduct.aspx 할 준비가 되었습니다. 4단계의 시작 부분에서 새 제품이 데이터베이스에 추가된 직후 실행되는 DetailsView 컨트롤의 ItemInserting 이벤트에 대한 이벤트 처리기를 만들었습니다. 해당 이벤트 처리기에 다음 코드를 추가합니다.

protected void NewProduct_ItemInserted(object sender, DetailsViewInsertedEventArgs e) 
{ 
    // Cast the loosely-typed Page.Master property and then set the GridMessageText property 
    Site myMasterPage = Page.Master as Site; 
    myMasterPage.GridMessageText = string.Format("{0} added to grid...", e.Values["ProductName"]); 
    // Use the strongly-typed Master property 
    Master.RefreshRecentProductsGrid();
}

위의 코드는 느슨하게 형식화된 Page.Master 속성과 강력한 형식 Master 의 속성을 모두 사용합니다. GridMessageText 이 속성은 "ProductName이 그리드에 추가됨..."으로 설정됩니다. 방금 추가된 제품의 값은 컬렉션을 통해 e.Values 액세스할 수 있습니다. 볼 수 있듯이 방금 추가 ProductName 된 값은 을 통해 e.Values["ProductName"]액세스됩니다.

그림 8은 새 제품인 Scott의 Soda가 데이터베이스에 추가된 직후의 페이지를 보여줍니다 AddProduct.aspx . 방금 추가한 제품 이름은 마스터 페이지의 레이블에 기록되며 GridView가 제품 및 가격을 포함하도록 새로 고쳐졌습니다.

마스터 페이지의 레이블 및 GridView에 방금 추가된 제품 표시

그림 08: 마스터 페이지의 레이블 및 GridView에 방금 추가된 제품 표시(전체 크기 이미지를 보려면 클릭)

요약

이상적으로 마스터 페이지와 해당 콘텐츠 페이지는 서로 완전히 분리되어 있으며 상호 작용 수준이 필요하지 않습니다. 마스터 페이지와 콘텐츠 페이지는 해당 목표를 염두에 두고 설계해야 하지만 콘텐츠 페이지가 마스터 페이지와 상호 작용해야 하는 일반적인 시나리오가 많이 있습니다. 가장 일반적인 이유 중 하나는 콘텐츠 페이지에서 발생한 일부 작업을 기반으로 마스터 페이지 디스플레이의 특정 부분을 업데이트하는 데 중점을 두고 있습니다.

좋은 소식은 콘텐츠 페이지가 프로그래밍 방식으로 마스터 페이지와 상호 작용하는 것이 비교적 간단하다는 것입니다. 먼저 마스터 페이지에서 콘텐츠 페이지에서 호출해야 하는 기능을 캡슐화하는 공용 속성 또는 메서드를 만듭니다. 그런 다음 콘텐츠 페이지에서 느슨하게 형식화된 Page.Master 속성을 통해 마스터 페이지의 속성 및 메서드에 액세스하거나 지시문을 사용하여 @MasterType 마스터 페이지에 강력한 형식의 참조를 만듭니다.

다음 자습서에서는 마스터 페이지가 해당 콘텐츠 페이지 중 하나와 프로그래밍 방식으로 상호 작용하는 방법을 검토합니다.

행복한 프로그래밍!

추가 정보

이 자습서에서 설명하는 항목에 대한 자세한 내용은 다음 리소스를 참조하세요.

작성자 정보

여러 ASP/ASP.NET 책의 저자이자 4GuysFromRolla.com 창립자인 Scott Mitchell은 1998년부터 Microsoft 웹 기술을 연구해 왔습니다. Scott은 독립 컨설턴트, 트레이너 및 작가로 일합니다. 그의 최신 책은 샘스 가르쳐 자신을 ASP.NET 3.5 24 시간. Scott은 자신의 블로그에서 mitchell@4GuysFromRolla.com 또는 블로그를 통해 연락할 수 있습니다 http://ScottOnWriting.NET.

특별 감사

이 자습서 시리즈는 많은 유용한 검토자가 검토했습니다. 이 자습서의 수석 검토자는 Zack Jones였습니다. 예정된 MSDN 문서를 검토하는 데 관심이 있으신가요? 그렇다면 다음에서 줄을 놓습니다. mitchell@4GuysFromRolla.com