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

작성자 : Scott Mitchell

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

소개

이전 자습서에서는 콘텐츠 페이지가 프로그래밍 방식으로 해당 master 페이지와 상호 작용하는 방법을 검토했습니다. 가장 최근에 추가된 5개의 제품을 나열하는 GridView 컨트롤을 포함하도록 master 페이지를 업데이트했습니다. 그런 다음 사용자가 새 제품을 추가할 수 있는 콘텐츠 페이지를 만들었습니다. 새 제품을 추가하면 콘텐츠 페이지가 방금 추가된 제품을 포함하도록 master 페이지에 GridView를 새로 고치도록 지시해야 했습니다. 이 기능은 gridView에 바인딩된 데이터를 새로 고친 master 페이지에 public 메서드를 추가한 다음 콘텐츠 페이지에서 해당 메서드를 호출하여 수행되었습니다.

가장 일반적인 형태의 콘텐츠 및 master 페이지 상호 작용은 콘텐츠 페이지에서 시작됩니다. 그러나 master 페이지에서 현재 콘텐츠 페이지가 작동할 수 있으며, master 페이지에 사용자가 콘텐츠 페이지에 표시되는 데이터를 수정할 수 있는 사용자 인터페이스 요소가 포함된 경우 이러한 기능이 필요할 수 있습니다. GridView 컨트롤에 제품 정보를 표시하는 콘텐츠 페이지와 단추 컨트롤이 포함된 master 페이지에서 클릭할 때 모든 제품의 가격을 두 배로 늘릴 수 있습니다. 이전 자습서의 예제와 마찬가지로 새 가격을 표시하도록 이중 가격 단추를 클릭한 후 GridView를 새로 고쳐야 하지만, 이 시나리오에서는 콘텐츠 페이지를 작동시켜야 하는 master 페이지입니다.

이 자습서에서는 master 페이지가 콘텐츠 페이지에 정의된 기능을 호출하도록 하는 방법을 살펴봅니다.

이벤트 및 이벤트 처리기를 통한 프로그래밍 방식 상호 작용 선동

master 페이지에서 콘텐츠 페이지 기능을 호출하는 것은 다른 방법보다 더 어렵습니다. 콘텐츠 페이지에는 단일 master 페이지가 있으므로 콘텐츠 페이지에서 프로그래밍 방식의 상호 작용을 선동할 때 사용할 수 있는 공용 메서드 및 속성이 무엇인지 알 수 있습니다. 그러나 master 페이지에는 각각 고유한 속성 및 메서드 집합이 있는 다양한 콘텐츠 페이지가 있을 수 있습니다. 그렇다면 런타임까지 어떤 콘텐츠 페이지가 호출될지 모를 때 master 페이지에 코드를 작성하여 콘텐츠 페이지에서 일부 작업을 수행할 수 있는 방법은 무엇인가요?

단추 컨트롤과 같은 ASP.NET 웹 컨트롤을 고려합니다. 단추 컨트롤은 여러 ASP.NET 페이지에 표시될 수 있으며 클릭되었음을 페이지에 알릴 수 있는 메커니즘이 필요합니다. 이 작업은 이벤트를 사용하여 수행 됩니다. 특히 Button 컨트롤은 클릭할 때 이벤트를 발생합니다 Click . 단추가 포함된 ASP.NET 페이지에서 이벤트 처리기를 통해 필요에 따라 해당 알림에 응답할 수 있습니다.

동일한 패턴을 사용하여 콘텐츠 페이지에 master 페이지 트리거 기능을 사용할 수 있습니다.

  1. master 페이지에 이벤트를 추가합니다.
  2. master 페이지가 콘텐츠 페이지와 통신해야 할 때마다 이벤트를 발생합니다. 예를 들어 master 페이지에서 사용자가 가격을 두 배로 늘렸다는 사실을 콘텐츠 페이지에 경고해야 하는 경우 해당 이벤트는 가격이 두 배로 상승한 직후에 발생합니다.
  3. 해당 콘텐츠 페이지에서 몇 가지 작업을 수행해야 하는 이벤트 처리기를 만듭니다.

이 자습서의 나머지 부분에서는 소개에 설명된 예제를 구현합니다. 즉, 데이터베이스의 제품을 나열하는 콘텐츠 페이지와 가격을 두 배로 늘리기 위한 Button 컨트롤이 포함된 master 페이지입니다.

1단계: 콘텐츠 페이지에 제품 표시

첫 번째 비즈니스 순서는 Northwind 데이터베이스의 제품을 나열하는 콘텐츠 페이지를 만드는 것입니다. (이전 자습서의 콘텐츠 페이지에서 마스터 페이지와 상호 작용에서 Northwind 데이터베이스를 프로젝트에 추가했습니다.) 먼저 라는 Products.aspx폴더에 새 ASP.NET 페이지를 ~/Admin 추가하여 master 페이지에 바인딩해야 합니다 Site.master . 그림 1은 이 페이지가 웹 사이트에 추가된 후의 솔루션 탐색기 보여줍니다.

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

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

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

마지막으로 이 단원에 Web.sitemap 대한 항목을 포함하도록 파일을 업데이트합니다. 콘텐츠-마스터 페이지 상호 작용 단원의 아래에 <siteMapNode> 다음 태그를 추가합니다.

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

<siteMapNode> 요소의 추가는 단원 목록에 반영됩니다(그림 5 참조).

로 돌아갑니다 Products.aspx. 의 콘텐츠 컨트롤 MainContent에서 GridView 컨트롤을 추가하고 이름을 로 지정합니다 ProductsGrid. GridView를 라는 ProductsDataSource새 SqlDataSource 컨트롤에 바인딩합니다.

GridView를 새 SqlDataSource 컨트롤에 바인딩

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

Northwind 데이터베이스를 사용할 수 있도록 마법사를 구성합니다. 이전 자습서를 진행한 경우 에 라는 NorthwindConnectionStringWeb.config연결 문자열 이미 있어야 합니다. 그림 3과 같이 드롭다운 목록에서 이 연결 문자열 선택합니다.

Northwind 데이터베이스를 사용하도록 SqlDataSource 구성

그림 03: Northwind 데이터베이스를 사용하도록 SqlDataSource 구성(전체 크기 이미지를 보려면 클릭)

그런 다음 드롭다운 목록에서 Products 테이블을 선택하고 및 UnitPrice 열을 반환하여 ProductName 데이터 소스 컨트롤의 SELECT 문을 지정합니다(그림 4 참조). 다음을 클릭한 다음 마침을 클릭하여 데이터 원본 구성 마법사를 완료합니다.

Products 테이블에서 ProductName 및 UnitPrice 필드를 반환합니다.

그림 04: 테이블에서 및 UnitPrice 필드를 Products 반환 ProductName 합니다(전체 크기 이미지를 보려면 클릭).

이제 모든 작업을 마쳤습니다. 마법사를 완료한 후 Visual Studio는 GridView에 두 개의 BoundFields를 추가하여 SqlDataSource 컨트롤에서 반환된 두 필드를 미러. GridView 및 SqlDataSource 컨트롤의 태그는 다음과 같습니다. 그림 5는 브라우저를 통해 볼 때의 결과를 보여줍니다.

<asp:GridView ID="ProductsGrid" runat="server" AutoGenerateColumns="False" 
 DataSourceID="ProductsDataSource">
 <Columns>
 <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
 SortExpression="ProductName" />
 <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" 
 SortExpression="UnitPrice" />
 </Columns>
</asp:GridView>

<asp:SqlDataSource ID="ProductsDataSource" runat="server" 
 ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
 SelectCommand="SELECT [ProductName], [UnitPrice] FROM [Products]">
</asp:SqlDataSource>

각 제품 및 해당 가격은 GridView에 나열됩니다.

그림 05: 각 제품 및 해당 가격이 GridView에 나열됩니다(전체 크기 이미지를 보려면 클릭).

참고

GridView의 모양을 자유롭게 클린 수 있습니다. 표시된 UnitPrice 값을 통화로 서식 지정하고 배경색과 글꼴을 사용하여 그리드의 모양을 개선하는 것이 제안됩니다. ASP.NET 데이터 표시 및 서식 지정에 대한 자세한 내용은 데이터 작업 자습서 시리즈를 참조하세요.

2단계: 마스터 페이지에 이중 가격 단추 추가

다음 작업은 단추 웹 컨트롤을 master 페이지에 추가하여 클릭하면 데이터베이스에 있는 모든 제품의 가격이 두 배로 늘어나게 됩니다. Site.master master 페이지를 열고 도구 상자에서 Designer 단추를 끌어 이전 자습서에서 추가한 SqlDataSource 컨트롤 아래에 RecentProductsDataSource 배치합니다. Button의 ID 속성을 로 DoublePrice 설정하고 해당 Text 속성을 "이중 제품 가격"으로 설정합니다.

다음으로 sqlDataSource 컨트롤을 master 페이지에 추가하고 이름을 로 지정합니다DoublePricesDataSource. 이 SqlDataSource는 모든 가격을 두 배로 늘리기 위해 문을 실행하는 UPDATE 데 사용됩니다. 특히 해당 및 UpdateCommand 속성을 적절한 연결 문자열 및 UPDATE 문으로 설정 ConnectionString 해야 합니다. 그런 다음 단추를 클릭할 때 이 SqlDataSource 컨트롤의 Update 메서드를 DoublePrice 호출해야 합니다. 및 UpdateCommand 속성을 설정 ConnectionString 하려면 SqlDataSource 컨트롤을 선택한 다음, 속성 창 이동합니다. 속성은 ConnectionString 드롭다운 목록에 이미 저장된 Web.config 연결 문자열을 나열합니다. 그림 6과 같이 옵션을 선택합니다 NorthwindConnectionString .

NorthwindConnectionString을 사용하도록 SqlDataSource 구성

그림 06: 를 사용하도록 NorthwindConnectionString SqlDataSource 구성(전체 크기 이미지를 보려면 클릭)

속성을 설정 UpdateCommand 하려면 속성 창 UpdateQuery 옵션을 찾습니다. 이 속성을 선택하면 타원이 있는 단추가 표시됩니다. 그림 7에 표시된 명령 및 매개 변수 편집기 대화 상자를 표시하려면 이 단추를 클릭합니다. 대화 상자의 텍스트 상자에 다음 UPDATE 문을 입력합니다.

UPDATE Products SET UnitPrice = UnitPrice * 2

이 문을 실행하면 테이블의 UnitPrice 각 레코드에 대한 값이 Products 두 배가 됩니다.

SqlDataSource의 UpdateCommand 속성 설정

그림 07: SqlDataSource의 UpdateCommand 속성 설정(전체 크기 이미지를 보려면 클릭)

이러한 속성을 설정한 후 Button 및 SqlDataSource 컨트롤의 선언적 태그는 다음과 유사하게 표시됩니다.

<asp:Button ID="DoublePrice" runat="server" 
 Text="Double Product Prices" />

<asp:SqlDataSource ID="DoublePricesDataSource" runat="server" 
 UpdateCommand="UPDATE Products SET UnitPrice = UnitPrice * 2" 
 ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
 ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>">
</asp:SqlDataSource>

단추가 클릭될 때 DoublePrice 메서드를 Update 호출하기만 하면 됩니다. Button에 Click 대한 DoublePrice 이벤트 처리기를 만들고 다음 코드를 추가합니다.

Protected Sub DoublePrice_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DoublePrice.Click
 ' Double the prices
 DoublePricesDataSource.Update()
End Sub

이 기능을 테스트하려면 1단계에서 만든 페이지를 방문하여 ~/Admin/Products.aspx "이중 제품 가격" 단추를 클릭합니다. 단추를 클릭하면 포스트백이 발생하고 Button의 Click 이벤트 처리기가 실행 DoublePrice 되어 모든 제품의 가격이 두 배로 증가합니다. 그러면 페이지가 다시 렌더링되고 태그가 반환되고 브라우저에 다시 표시됩니다. 그러나 콘텐츠 페이지의 GridView는 "이중 제품 가격" 단추를 클릭하기 전과 동일한 가격을 나열합니다. 이는 GridView에 처음 로드된 데이터가 뷰 상태에 저장되었으므로 달리 지시하지 않는 한 포스트백에 다시 로드되지 않기 때문입니다. 다른 페이지를 방문한 다음 페이지로 ~/Admin/Products.aspx 돌아가면 업데이트된 가격이 표시됩니다.

3단계: 가격이 두 배가 되면 이벤트 발생

페이지의 GridView가 ~/Admin/Products.aspx 즉시 가격을 두 배로 반영하지 않기 때문에 사용자는 당연히 "이중 제품 가격" 단추를 클릭하지 않았거나 작동하지 않았다고 생각할 수 있습니다. 그들은 단추를 몇 번 더 클릭하여 가격을 몇 번이나 두 배로 늘릴 수 있습니다. 이 문제를 해결하려면 콘텐츠 페이지의 그리드가 두 배가 된 직후 새 가격을 표시해야 합니다.

이 자습서의 앞부분에서 설명한 대로 사용자가 단추를 클릭할 때마다 master 페이지에서 이벤트를 발생시켜야 합니다DoublePrice. 이벤트는 한 클래스(이벤트 게시자)가 다른 클래스 집합(이벤트 구독자)에게 흥미로운 일이 발생했음을 알리는 방법입니다. 이 예제에서 master 페이지는 이벤트 게시자입니다. 단추를 클릭할 때 DoublePrice 관심 있는 콘텐츠 페이지는 구독자입니다.

클래스는 발생되는 이벤트에 대한 응답으로 실행되는 메서드인 이벤트 처리기를 만들어 이벤트를 구독합니다. 게시자는 이벤트 대리자를 정의하여 발생하는 이벤트를 정의합니다. 이벤트 대리자는 이벤트 처리기가 수락해야 하는 입력 매개 변수를 지정합니다. .NET Framework 이벤트 대리자는 값을 반환하지 않으며 두 개의 입력 매개 변수를 허용합니다.

  • Object이벤트 원본을 식별하는 및
  • 에서 파생된 클래스 System.EventArgs

이벤트 처리기에 전달된 두 번째 매개 변수에는 이벤트에 대한 추가 정보가 포함될 수 있습니다. 기본 EventArgs 클래스는 정보를 전달하지 않지만 .NET Framework 추가 속성을 확장하고 EventArgs 포함하는 여러 클래스를 포함합니다. 예를 들어 CommandEventArgs instance 이벤트에 응답 Command 하는 이벤트 처리기에 전달되며 및 의 두 가지 정보 속성을 CommandArgumentCommandName포함합니다.

참고

이벤트를 만들고, 발생시키고, 처리하는 방법에 대한 자세한 내용은 간단한 영어로 이벤트 및 대리자이벤트 대리자를 참조하세요.

이벤트를 정의하려면 다음 구문을 사용합니다.

Public Event eventName As eventDelegate

사용자가 단추를 클릭하고 DoublePrice 다른 추가 정보를 전달할 필요가 없는 경우에만 콘텐츠 페이지에 경고해야 하므로 두 번째 매개 변수로 허용하는 이벤트 처리기를 정의하는 이벤트 대리 EventHandler자 를 형식 System.EventArgs의 개체로 정의할 수 있습니다. master 페이지에서 이벤트를 만들려면 master 페이지의 코드 숨김 클래스에 다음 코드 줄을 추가합니다.

Partial Class Site
 Inherits System.Web.UI.MasterPage

 Public Event PricesDoubled As EventHandler
 ...
End Class

위의 코드는 라는 PricesDoubledmaster 페이지에 공개 이벤트를 추가합니다. 우리는 이제 가격이 두 배로 상승 한 후이 이벤트를 인상해야합니다. 이벤트를 발생하려면 다음 구문을 사용합니다.

RaiseEvent eventName(sender, eventArgs)

여기서 발신자eventArgs는 구독자의 이벤트 처리기에 전달하려는 값입니다.

DoublePriceClick 다음 코드로 이벤트 처리기를 업데이트합니다.

Protected Sub DoublePrice_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DoublePrice.Click
 ' Double the prices
 DoublePricesDataSource.Update()

 ' Refresh RecentProducts
 RecentProducts.DataBind()

 ' Raise the PricesDoubled event
 RaiseEvent PricesDoubled(Me, EventArgs.Empty)
End Sub

이전 Click 과 마찬가지로 이벤트 처리기는 SqlDataSource 컨트롤의 Update 메서드를 호출 DoublePricesDataSource 하여 모든 제품의 가격을 두 배로 하여 시작합니다. 다음에는 이벤트 처리기에 두 가지가 추가됩니다. RecentProducts 먼저 GridView의 데이터가 새로 고쳐집니다. 이 GridView는 이전 자습서의 master 페이지에 추가되었으며 가장 최근에 추가된 5개의 제품을 표시합니다. 이 5개 제품의 가격이 두 배로 증가하도록 이 그리드를 새로 고쳐야 합니다. 그런 다음 PricesDoubled 이벤트가 발생합니다. master 페이지 자체(Me)에 대한 참조는 이벤트 원본으로 이벤트 처리기에 전송되고 빈 EventArgs 개체는 이벤트 인수로 전송됩니다.

4단계: 콘텐츠 페이지에서 이벤트 처리

이때 master 페이지는 단추 컨트롤을 DoublePrice 클릭할 때마다 이벤트를 발생합니다PricesDoubled. 그러나 이것은 전투의 절반에 불과합니다 - 우리는 여전히 구독자에서 이벤트를 처리해야합니다. 여기에는 이벤트 처리기를 만들고 이벤트가 발생할 때 이벤트 처리기가 실행되도록 이벤트 배선 코드를 추가하는 두 단계가 포함됩니다.

먼저 라는 이벤트 처리기를 만듭니다 Master_PricesDoubled. master 페이지에서 이벤트를 정의 PricesDoubled 한 방법 때문에 이벤트 처리기의 두 입력 매개 변수는 각각 및 EventArgs형식 Object 이어야 합니다. 이벤트 처리기에서 GridView의 DataBind 메서드를 호출 ProductsGrid 하여 데이터를 그리드에 다시 바인딩합니다.

Private Sub Master_PricesDoubled(ByVal sender As Object, ByVal e As EventArgs)
 ' Rebind data to ProductsGrid
 ProductsGrid.DataBind()
End Sub

이벤트 처리기의 코드가 완료되었지만 아직 master 페이지의 이벤트를 이 이벤트 처리기에 연결하지 PricesDoubled 않았습니다. 구독자는 다음 구문을 통해 이벤트를 이벤트 처리기에 연결합니다.

AddHandler publisher.eventName, AddressOf methodName

publishereventName을 제공하는 개체에 대한 참조이며 methodName 은 구독자에 정의된 이벤트 처리기의 이름입니다.

이 이벤트 배선 코드는 첫 번째 페이지 방문 및 후속 포스트백에서 실행되어야 하며 이벤트가 발생할 수 있을 때 앞에 오는 페이지 수명 주기의 지점에서 발생해야 합니다. 이벤트 배선 코드를 추가하는 좋은 시기는 페이지 수명 주기 초기에 발생하는 PreInit 단계입니다.

~/Admin/Products.aspx 이벤트 처리기를 열고 만듭니다Page_PreInit.

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreInit
 ' TODO: Put event wiring logic here
End Sub

이 배선 코드를 완료하려면 콘텐츠 페이지의 master 페이지에 대한 프로그래밍 방식 참조가 필요합니다. 이전 자습서에서 설명한 대로 다음 두 가지 방법으로 이 작업을 수행할 수 있습니다.

  • 느슨한 형식 Page.Master 의 속성을 적절한 master 페이지 형식으로 캐스팅하거나
  • 페이지에 지시문을 .aspx 추가한 @MasterType 다음 강력한 형식 Master 의 속성을 사용합니다.

후자의 접근 방식을 사용하겠습니다. 페이지의 선언적 태그 맨 위에 다음 @MasterType 지시문을 추가합니다.

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

그런 다음 이벤트 처리기에 다음 이벤트 배선 코드를 Page_PreInit 추가합니다.

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreInit
 AddHandler Master.PricesDoubled, AddressOf Master_PricesDoubled
End Sub

이 코드를 사용하면 단추를 클릭할 때마다 콘텐츠 페이지의 GridView가 DoublePrice 새로 고쳐집니다.

그림 8과 9는 이 동작을 보여 줍니다. 그림 8은 처음 방문했을 때의 페이지를 보여줍니다. GridView(master 페이지의 왼쪽 열)와 ProductsGrid GridView(콘텐츠 페이지)의 가격 값 RecentProducts 입니다. 그림 9는 단추를 클릭한 직후의 DoublePrice 동일한 화면을 보여줍니다. 볼 수 있듯이 새 가격은 두 GridViews 모두에 즉시 반영됩니다.

초기 가격 값

그림 08: 초기 가격 값(전체 크기 이미지를 보려면 클릭)

Just-Doubled 가격은 GridViews에 표시됩니다.

그림 09: Just-Doubled 가격이 GridViews에 표시됩니다(전체 크기 이미지를 보려면 클릭).

요약

이상적으로는 master 페이지와 해당 콘텐츠 페이지가 완전히 분리되어 있으며 상호 작용 수준이 필요하지 않습니다. 그러나 master 페이지 또는 콘텐츠 페이지에서 수정할 수 있는 데이터를 표시하는 master 페이지 또는 콘텐츠 페이지가 있는 경우, 표시를 업데이트할 수 있도록 데이터를 수정할 때 master 페이지가 콘텐츠 페이지(또는 그 반대의 경우도 마찬가지)에 경고해야 할 수 있습니다. 이전 자습서에서는 콘텐츠 페이지가 master 페이지와 프로그래밍 방식으로 상호 작용하는 방법을 살펴보았습니다. 이 자습서에서는 master 페이지가 상호 작용을 시작하는 방법을 살펴보았습니다.

콘텐츠와 master 페이지 간의 프로그래밍 방식 상호 작용은 콘텐츠 또는 master 페이지에서 시작되지만 사용되는 상호 작용 패턴은 원본에 따라 달라집니다. 차이점은 콘텐츠 페이지에 단일 master 페이지가 있지만 master 페이지에는 다양한 콘텐츠 페이지가 있을 수 있기 때문입니다. master 페이지가 콘텐츠 페이지와 직접 상호 작용하는 대신 master 페이지가 이벤트를 발생하여 일부 작업이 수행되었음을 알리는 것이 더 나은 방법입니다. 작업에 관심이 있는 콘텐츠 페이지는 이벤트 처리기를 만들 수 있습니다.

행복한 프로그래밍!

추가 정보

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

저자 정보

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

특별 감사

이 자습서 시리즈는 많은 유용한 검토자가 검토했습니다. 이 자습서의 수석 검토자는 Suchi Banerjee였습니다. 예정된 MSDN 문서를 검토하시겠습니까? 그렇다면 에서 줄을 놓습니다. mitchell@4GuysFromRolla.com