다음을 통해 공유


ASP.NET Dynamic Data 스캐폴딩 및 페이지 템플릿 개요

업데이트: 2007년 11월

소프트웨어를 개발할 때 데이터를 표시하고 편집하는 작업은 반복적인 작업입니다. ASP.NET Dynamic Data를 사용하면 최소한의 코드만 작성하거나 코드를 전혀 작성하지 않고 데이터 기반 응용 프로그램을 만들 수 있습니다. 스캐폴딩 메커니즘은 이러한 응용 프로그램을 빠르게 생성할 수 있도록 지원하는 Dynamic Data의 중요한 기능입니다.

이 항목의 내용은 다음과 같습니다.

  • 스캐폴딩

  • 페이지 템플릿

스캐폴딩

스캐폴딩은 기존 ASP.NET 페이지 프레임워크의 강력한 기능을 활용할 뿐만 아니라 실제 페이지 없이 데이터 모델을 기반으로 페이지를 동적으로 표시함으로써 이를 더욱 향상시키는 메커니즘입니다.

스캐폴딩 메커니즘을 사용할 경우 얻을 수 있는 이점은 다음과 같습니다.

  • 최소한의 코드만 작성하거나 코드를 전혀 작성하지 않고 데이터 기반 웹 응용 프로그램 만들기

  • 빠른 개발 시간

  • 모든 기능을 갖춘 페이지 생성. 모든 데이터베이스 작업(보기, 삽입, 편집 및 삭제)과 정렬 및 페이징 기능이 지원됩니다.

  • 데이터베이스 스키마에 기반한 기본 제공 데이터 유효성 검사

  • 각 외래 키나 Boolean 필드에 대해 생성되는 자동 필터

Dynamic Data는 URL 라우팅을 사용하여 요청을 일치시키고 처리합니다. 스캐폴딩 메커니즘에서는 사용자가 보려고 하는 뷰 및 테이블을 요청된 URL에서 유추합니다. 라우팅 메커니즘의 이점은 요청된 URL이 응용 프로그램의 실제 경로와 일치할 필요가 없다는 것입니다.

스캐폴딩 메커니즘 활성화

스캐폴딩 메커니즘은 기본적으로 해제되어 있습니다. 스캐폴딩 메커니즘은 표시, 편집, 삽입 및 삭제 기능을 위해 데이터 모델 전체를 노출할 수 있으며 이로 인해 보안 위험이 나타날 수 있으므로 신중을 기해 활성화해야 합니다.

다음 방법에 따라 스캐폴딩 메커니즘을 활성화할 수 있습니다.

Dynamic Data 기능을 사용하는 데이터 컨텍스트를 등록해야 하며 이 등록 작업은 스캐폴딩 메커니즘을 사용하지 않을 경우에도 필요합니다. RegisterContext 메서드를 사용하여 global.asax 파일에서 등록 작업을 수행합니다. RegisterContext 메서드는 ContextConfiguration 개체를 매개 변수로 사용합니다. 데이터 컨텍스트를 등록하는 동안 스캐폴딩 메커니즘을 활성화하려면 ContextConfiguration 개체의 ScaffoldAllTables 속성을 true로 설정합니다. 이렇게 하면 데이터 모델 전체에 대해 스캐폴딩 메커니즘이 활성화됩니다. 다시 말해, 데이터 모델의 모든 테이블이 표시, 편집, 삽입 및 삭제 기능에 사용될 수 있도록 노출됩니다. 일부 테이블이 스캐폴딩 메커니즘에 노출되지 않도록 하려면 ScaffoldTableAttribute 특성을 사용하면 됩니다.

다음 예제에서는 AdventureWorksLT 데이터베이스에 대한 데이터 컨텍스트를 등록하는 동안 데이터 모델의 모든 테이블에 대해 스캐폴딩 메커니즘을 활성화하는 방법을 보여 줍니다.

model.RegisterContext(GetType(AdventureWorksLTDataContext), _
                      New ContextConfiguration() With {.ScaffoldAllTables = True})
model.RegisterContext(typeof(AdventureWorksLTDataContext),
    new ContextConfiguration() { ScaffoldAllTables = true });

ScaffoldTableAttribute 특성을 사용하여 특정 테이블에 대해서만 스캐폴딩 메커니즘을 활성화 또는 비활성화하여 노출되는 테이블을 보다 세부적으로 제어할 수 있습니다. 이렇게 하면 데이터 모델 전체를 노출한 후 노출되지 않도록 할 테이블을 숨기는 대신 처음부터 응용 프로그램에 필요한 테이블만 노출할 수 있습니다. ScaffoldTableAttribute 특성을 적용하려면 데이터 모델의 엔터티 클래스와 이름이 동일한 partial 클래스를 만든 다음 이 partial 클래스에 특성을 적용해야 합니다.

다음 예제에서는 개별 테이블에 대해 스캐폴딩 메커니즘을 활성화하는 방법을 보여 줍니다.

Imports System.ComponentModel.DataAnnotations

<ScaffoldTable(True)> _
Partial Public Class Product
End Class
using System.ComponentModel.DataAnnotations;

[ScaffoldTable(true)]
public partial class Product {
}

ScaffoldColumnAttribute 특성을 사용하여 특정 데이터 필드에 대해 스캐폴딩 메커니즘을 활성화 또는 비활성화하여 노출되는 데이터 필드를 보다 세부적으로 제어할 수 있습니다.

Dynamic Data는 기본적으로 모든 데이터 필드를 표시하지는 않습니다. 다음은 Dynamic Data가 데이터 필드를 표시하거나 숨기는 데 사용하는 몇 가지 중요한 규칙입니다.

  • ScaffoldColumnAttribute 특성이 데이터 필드에 적용되면 데이터 필드가 표시됩니다. 이 규칙은 다음의 모든 규칙에 우선합니다.

  • UIHintAttribute 특성이 데이터 필드에 적용되면 데이터 필드가 표시됩니다. 이 규칙은 다음의 모든 규칙에 우선합니다.

  • 데이터 필드가 외래 키 필드이면 데이터 필드가 표시되지 않습니다. 이는 Dynamic Data가 외래 키 필드를 다른 방식으로 처리하고 일반적으로 외래 키 필드 값을 표시하지 않기 때문에 발생합니다.

  • 데이터 필드가 데이터베이스에서 자동으로 생성되면 데이터 필드가 표시되지 않습니다. 일반적으로 이러한 종류의 필드에는 관련 정보가 포함되지 않습니다. 데이터 필드를 표시해야 하는 경우에는 UIHintAttribute 특성을 데이터 필드에 적용해야 합니다.

IsCustomProperty 속성 값이 true이면 데이터 필드가 표시되지 않습니다.

ScaffoldColumnAttribute 특성을 적용하려면 연결된 메타데이터 클래스를 만들어 이 클래스에서 ScaffoldColumnAttribute 특성을 데이터 필드에 적용합니다. 또한 데이터 모델의 엔터티 클래스와 이름이 동일한 partial 클래스를 만들어 이 partial 클래스에 MetadataTypeAttribute 특성을 적용한 다음 두 클래스를 연결해야 합니다.

다음 예제에서는 PasswordHash와 PasswordSalt라는 특정 데이터 필드를 스캐폴딩 메커니즘에서 숨기는 방법을 보여 줍니다.

Imports System.ComponentModel.DataAnnotations

<MetadataType(GetType(Customer_Metadata))> _
Partial Public Class Customer

End Class

Public Class Customer_Metadata
    <ScaffoldColumn(False)> _
    Public PasswordHash As Object

    <ScaffoldColumn(False)> _
    Public PasswordSalt As Object
End Class
using System.ComponentModel.DataAnnotations;

[MetadataType(typeof(Customer_Metadata))]
public partial class Customer
{
}

public class Customer_Metadata
{
    [ScaffoldColumn(false)]
    public object PasswordHash;

    [ScaffoldColumn(false)]
    public object PasswordSalt;
}

페이지 템플릿

ASP.NET Dynamic Data 스캐폴딩 메커니즘은 템플릿을 사용하여 데이터의 기본 뷰를 제공합니다. 템플릿은 일반 ASP.NET 페이지입니다. 다시 말해 템플릿을 변경하여 웹 응용 프로그램 전체에서 생성되는 페이지의 모양과 동작을 변경할 수 있습니다.

ASP.NET Dynamic Data 응용 프로그램을 만들면 프로젝트 템플릿에 따라 프로젝트에 DynamicData 폴더가 추가됩니다. 다음 표에서는 Dynamic Data를 통해 DynamicData\PageTemplates 폴더에 제공되는 페이지 템플릿을 보여 줍니다.

페이지 템플릿 이름

설명

Details.aspx

데이터베이스의 단일 행에 대한 자세한 뷰를 제공합니다. 데이터를 표시하기 위해 DetailsView 컨트롤을 사용합니다. 선택 작업에 사용되는 기본 템플릿입니다.

Edit.aspx

데이터베이스 테이블의 단일 행을 편집하기 위한 인터페이스를 제공합니다. 데이터를 편집하기 위해 DetailsView 컨트롤을 사용합니다. 편집 작업에 사용되는 기본 템플릿입니다.

Insert.aspx

데이터베이스 테이블에 단일 행을 삽입하기 위한 인터페이스를 제공합니다. 데이터를 삽입하기 위해 DetailsView 컨트롤을 사용합니다. 삽입 작업에 사용되는 기본 템플릿입니다.

List.aspx

데이터베이스 테이블의 행 목록을 표시합니다. 각 외래 키 열 또는 부울 열의 데이터를 필터링하고 정렬 및 페이징 기능을 위한 DropDownList 컨트롤을 제공합니다. 행 목록을 표시하기 위해 GridView 컨트롤을 사용합니다. 표시 작업에 사용되는 기본 템플릿입니다.

ListDetails.aspx

데이터베이스 테이블의 행 목록을 표시합니다. 각 외래 키 열 또는 부울 열의 데이터를 필터링하고 정렬 및 페이징 기능을 위한 DropDownList 컨트롤을 제공합니다. 행 목록을 표시하기 위해 GridView 컨트롤을 사용하고 선택된 행 표시 및 새 레코드 삽입을 위해 DetailsView 컨트롤을 사용합니다. 모든 기능을 통합하여 제공하는 템플릿입니다. 기본적으로 사용되지 않지만 Global.asax 파일에서 구성을 변경하여 이 템플릿을 사용할 수도 있습니다.

Dynamic Data에서 제공하는 모든 기본 템플릿에는 공통적으로 다음과 같은 특징이 있습니다.

  • 루트 폴더에 있는 Site.master라는 마스터 페이지를 사용합니다. 마스터 페이지는 스타일시트와 기본 헤더를 정의하며 웹 사이트에 AJAX 기능을 사용하는 데 필요한 ScriptManager 컨트롤도 포함합니다. 디버깅을 위해 ScriptManager 컨트롤의 EnablePartialRendering 속성을 false로 설정하여 부분 페이지 업데이트를 해제할 수도 있습니다. 자세한 내용은 AJAX 및 클라이언트 기능 추가를 참조하십시오.

  • 각 페이지 템플릿에는 포스트백 없이 부분 렌더링을 사용하는 데 필요한 UpdatePanel 컨트롤이 포함되어 있습니다. 자세한 내용은 UpdatePanel 웹 서버 컨트롤 선언 구문를 참조하십시오.

  • 또한 각 페이지 템플릿에는 템플릿에 있는 데이터 바인딩된 컨트롤 및 데이터 소스 컨트롤에 동적 동작을 추가하는 데 필요한 DynamicDataManager 컨트롤도 포함되어 있습니다.

페이지 템플릿 사용자 지정

Dynamic Data의 기본 제공 템플릿을 사용자 지정할 수 있습니다. 이 작업은 다음 두 방법으로 수행할 수 있습니다.

  • 기본 제공 페이지 템플릿 사용자 지정

  • 특정 테이블의 레이아웃 사용자 지정

기본 제공 페이지 템플릿은 DynamicData\PageTemplates 폴더에 있는 페이지를 변경하여 사용자 지정할 수 있습니다. 이 폴더에서 변경한 내용은 웹 응용 프로그램 전체에서 스캐폴딩 메커니즘을 사용하여 생성되는 페이지의 모양과 동작에 영향을 줍니다.

스캐폴딩 메커니즘을 사용하면서 특정 테이블에 대한 사용자 지정 페이지를 만들 수도 있습니다. 이렇게 하려면 데이터 모델의 엔터티 테이블과 이름이 동일한 폴더를 DynamicData\CustomPages 폴더 아래에 만들어야 합니다. 전역으로 사용되는 페이지 템플릿과 이름이 동일한 페이지를 이 새 폴더에 추가합니다. 예를 들어 테이블에 대한 구체적인 세부 사항 페이지를 만들려면 페이지 이름을 Details.aspx로 지정합니다. 기본 제공 페이지 템플릿을 기반으로 사용자 지정 페이지를 만들 수 있습니다. 예제를 보려면 방법: 사용자 지정 페이지 템플릿을 사용하여 개별 테이블의 레이아웃 사용자 지정을 참조하십시오.

경로 사용자 지정

앞에서 설명했듯이 Dynamic Data는 ASP.NET 라우팅을 사용하여 URL 요청을 일치시키고 처리합니다. 경로는 global.asax 파일에 정의됩니다. Dynamic Data는 기본적으로 표시, 선택, 편집, 삽입과 같은 각 작업에 서로 다른 페이지 템플릿을 사용합니다. 삭제 기능은 목록 페이지와 세부 사항 페이지 모두에서 표시되는데, 그 이유는 삭제 작업에는 별도의 페이지 템플릿이 필요하지 않기 때문입니다.

경로를 사용자 지정하여 다른 URL을 표시할 수도 있지만 경로를 사용하면 다른 페이지 템플릿을 지정하거나 파일 확장명을 URL에서 제거하거나 쿼리 문자열 값 대신 경로를 사용하여 매개 변수를 전달할 수도 있습니다. 경로에 대한 자세한 내용은 ASP.NET 라우팅을 참조하십시오.

다음 예제에서는 모든 작업에 하나의 페이지 템플릿만 사용하도록 경로를 지정하는 방법을 보여 줍니다. 첫 번째 경로에서는 지정한 테이블에 대한 모든 작업을 하나의 페이지에서 수행할 수 있습니다. 두 번째 경로에서는 페이지에서 레코드의 세부 정보로 이동할 수 있습니다. 예를 들어 외래 키 필드가 있는 경우 관계 테이블로 이동할 수 있습니다.

routes.Add(New DynamicDataRoute("{table}/ListDetails.aspx") With { _
  .Action = PageAction.List, _
  .ViewName = "ListDetails", _
  .Model = model})

routes.Add(New DynamicDataRoute("{table}/ListDetails.aspx") With { _
  .Action = PageAction.Details, _
  .ViewName = "ListDetails", _
  .Model = model})
routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx")
{
    Action = PageAction.List,
    ViewName = "ListDetails",
    Model = model
});

routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx")
{
    Action = PageAction.Details,
    ViewName = "ListDetails",
    Model = model
});

특정 테이블에 다른 테이블에 사용되는 것과는 다른 페이지 템플릿을 지정하여 해당 테이블에 대한 고유한 경로를 만들 수도 있습니다. 경로는 정의된 순서대로 분석됩니다. 구체적인 경로를 먼저 정의한 후 일반적인 경로를 정의해야 합니다.

다음 예제에서는 AdventureWorks 데이터베이스의 Products 테이블에 대해서만 다른 페이지 템플릿을 지정한 다음 데이터베이스의 나머지 테이블에 대해서는 일반적인 템플릿을 정의하는 방법을 보여 줍니다.

routes.Add(New DynamicDataRoute("Products/{action}.aspx") With { _
  .ViewName = "ListDetails", _
  .Table = "Products", _
  .Model = model})

routes.Add(New DynamicDataRoute("{table}/{action}.aspx") With { _
  .Constraints = New RouteValueDictionary( _
    New With {.Action = "List|Details|Edit|Insert"}), _
  .Model = model})
routes.Add(new DynamicDataRoute("Products/{action}.aspx")
{
    ViewName = "ListDetails",
    Table = "Products",
    Model = model
});

routes.Add(new DynamicDataRoute("{table}/{action}.aspx")
{
    Constraints = new RouteValueDictionary(
      new { action = "List|Details|Edit|Insert" }),
    Model = model
});

참고 항목

개념

ASP.NET Dynamic Data 개요

ASP.NET 라우팅