데이터 주석 유효성 검사기를 사용한 유효성 검사(VB)

작성자: Microsoft

데이터 주석 모델 바인더를 활용하여 ASP.NET MVC 애플리케이션 내에서 유효성 검사를 수행합니다. Microsoft Entity Framework에서 다양한 유형의 유효성 검사기 특성을 사용하고 작업하는 방법을 알아봅니다.

이 자습서에서는 데이터 주석 유효성 검사기를 사용하여 ASP.NET MVC 애플리케이션에서 유효성 검사를 수행하는 방법을 알아봅니다. 데이터 주석 유효성 검사기를 사용하면 필수 또는 StringLength 특성과 같은 하나 이상의 특성을 클래스 속성에 추가하여 유효성 검사를 수행할 수 있다는 장점이 있습니다.

데이터 주석 모델 바인더는 Microsoft ASP.NET MVC 프레임워크의 공식 부분이 아니라는 것을 이해하는 것이 중요합니다. Microsoft ASP.NET MVC 팀에서 데이터 주석 모델 바인더를 만들었지만 Microsoft는 이 자습서에서 설명하고 사용하는 데이터 주석 모델 바인더에 대한 공식 제품 지원을 제공하지 않습니다.

데이터 주석 모델 바인더 사용

ASP.NET MVC 애플리케이션에서 데이터 주석 모델 바인더를 사용하려면 먼저 Microsoft.Web.Mvc.DataAnnotations.dll 어셈블리 및 System.ComponentModel.DataAnnotations.dll 어셈블리에 대한 참조를 추가해야 합니다. 메뉴 옵션 프로젝트, 참조 추가를 선택합니다. 그런 다음 찾아보기 탭을 클릭하고 데이터 주석 모델 바인더 샘플을 다운로드(및 압축 해제)한 위치로 이동합니다( 그림 1 참조).

참조 추가 대화 상자 이미지

그림 1: 데이터 주석 모델 바인더에 대한 참조 추가(전체 크기 이미지를 보려면 클릭)

Microsoft.Web.Mvc.DataAnnotations.dll 어셈블리와 System.ComponentModel.DataAnnotations.dll 어셈블리를 모두 선택하고 확인 단추를 클릭합니다.

데이터 주석 모델 바인더에서 .NET Framework 서비스 팩 1에 포함된 System.ComponentModel.DataAnnotations.dll 어셈블리를 사용할 수 없습니다. 데이터 주석 모델 바인더 샘플 다운로드에 포함된 System.ComponentModel.DataAnnotations.dll 어셈블리 버전을 사용해야 합니다.

마지막으로 Global.asax 파일에 DataAnnotations 모델 바인더를 등록해야 합니다. Application_Start() 메서드가 다음과 같이 보이도록 Application_Start() 이벤트 처리기에 다음 코드 줄을 추가합니다.

Protected Sub Application_Start()
    RegisterRoutes(RouteTable.Routes)
    ModelBinders.Binders.DefaultBinder = New Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder()
End Sub

이 코드 줄은 DataAnnotationsModelBinder를 전체 ASP.NET MVC 애플리케이션의 기본 모델 바인더로 등록합니다.

데이터 주석 유효성 검사기 특성 사용

데이터 주석 모델 바인더를 사용하는 경우 유효성 검사기 특성을 사용하여 유효성 검사를 수행합니다. System.ComponentModel.DataAnnotations 네임스페이스에는 다음 유효성 검사기 특성이 포함됩니다.

  • 범위 – 속성 값이 지정된 값 범위 사이에 속하는지 여부를 확인할 수 있습니다.
  • RegularExpression – 속성 값이 지정된 정규식 패턴과 일치하는지 여부를 확인할 수 있습니다.
  • 필수 – 속성을 필요에 따라 표시할 수 있습니다.
  • StringLength – 문자열 속성의 최대 길이를 지정할 수 있습니다.
  • 유효성 검사 – 모든 유효성 검사기 특성에 대한 기본 클래스입니다.

참고

유효성 검사 요구 사항이 표준 유효성 검사기에 의해 충족되지 않는 경우 기본 유효성 검사 특성에서 새 유효성 검사기 특성을 상속하여 사용자 지정 유효성 검사기 특성을 만들 수 있는 옵션이 항상 있습니다.

목록 1의 Product 클래스는 이러한 유효성 검사기 특성을 사용하는 방법을 보여 줍니다. Name, Description 및 UnitPrice 속성은 필수로 표시됩니다. Name 속성에는 10자 미만의 문자열 길이가 있어야 합니다. 마지막으로 UnitPrice 속성은 통화 금액을 나타내는 정규식 패턴과 일치해야 합니다.

Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations

Public Class Product

    Private _id As Integer
    Private _name As String
    Private _description As String
    Private _unitPrice As Decimal

    Public Property Id() As Integer
        Get
            Return _id
        End Get
        Set(ByVal value As Integer)
            _id = value
        End Set
    End Property

     _
    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property

     _
    Public Property Description() As String
        Get
            Return _description
        End Get
        Set(ByVal value As String)
            _description = value
        End Set
    End Property

     _
    Public Property UnitPrice() As Decimal
        Get
            Return _unitPrice
        End Get
        Set(ByVal value As Decimal)
            _unitPrice = value
        End Set
    End Property

End Class

목록 1: Models\Product.vb

Product 클래스는 하나의 추가 특성인 DisplayName 특성을 사용하는 방법을 보여 줍니다. DisplayName 특성을 사용하면 속성이 오류 메시지에 표시될 때 속성의 이름을 수정할 수 있습니다. "UnitPrice 필드가 필요합니다."라는 오류 메시지를 표시하는 대신 "가격 필드가 필요합니다"라는 오류 메시지를 표시할 수 있습니다.

참고

유효성 검사기에서 표시하는 오류 메시지를 완전히 사용자 지정하려는 경우 다음과 같이 유효성 검사기의 ErrorMessage 속성에 사용자 지정 오류 메시지를 할당할 수 있습니다. <Required(ErrorMessage:="This field needs a value!")>

목록 1의 Product 클래스를 목록 2의 Create() 컨트롤러 작업과 함께 사용할 수 있습니다. 이 컨트롤러 작업은 모델 상태에 오류가 있을 때 만들기 뷰를 다시 표시합니다.

Public Class ProductController
    Inherits System.Web.Mvc.Controller

    '
    ' GET: /Product/Create

    Function Create() As ActionResult
        Return View()
    End Function

    '
    ' POST: /Product/Create

     _
    Function Create( ByVal productToCreate As Product) As ActionResult

        If Not ModelState.IsValid Then
            Return View()
        End If

        Return RedirectToAction("Index")

    End Function

End Class

목록 2: Controllers\ProductController.vb

마지막으로 만들기() 작업을 마우스 오른쪽 단추로 클릭하고 메뉴 옵션 보기 추가를 선택하여 목록 3에서 보기를 만들 수 있습니다. Product 클래스를 모델 클래스로 사용하여 강력한 형식의 뷰를 만듭니다. 콘텐츠 보기 드롭다운 목록에서 만들기 를 선택합니다( 그림 2 참조).

보기 추가 대화 상자 이미지

그림 2: 보기 만들기 추가

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of MvcApplication1.Product)" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Create
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Create</h2>

    <%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>

    <% Using Html.BeginForm()%>

        <fieldset>
            <legend>Fields</legend>
            <p>
                <label for="Name">Name:</label>
                <%= Html.TextBox("Name") %>
                <%= Html.ValidationMessage("Name", "*") %>
            </p>
            <p>
                <label for="Description">Description:</label>
                <%= Html.TextBox("Description") %>
                <%= Html.ValidationMessage("Description", "*") %>
            </p>
            <p>
                <label for="UnitPrice">UnitPrice:</label>
                <%= Html.TextBox("UnitPrice") %>
                <%= Html.ValidationMessage("UnitPrice", "*") %>
            </p>
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>

    <% End Using %>

    <div>
        <%=Html.ActionLink("Back to List", "Index") %>
    </div>

</asp:Content>

목록 3: Views\Product\Create.aspx

참고

보기 추가 메뉴 옵션에서 생성된 양식 만들기 옵션에서 ID 필드를 제거합니다. ID 필드는 ID 열에 해당하므로 사용자가 이 필드의 값을 입력하도록 허용하지 않습니다.

제품을 만들기 위한 양식을 제출하고 필수 필드에 대한 값을 입력하지 않으면 그림 3 의 유효성 검사 오류 메시지가 표시됩니다.

모든 유효성 검사 오류 메시지 이미지

그림 3: 필수 필드 누락

잘못된 통화 금액을 입력하면 그림 4 의 오류 메시지가 표시됩니다.

잘못된 통화 오류 메시지 이미지

그림 4: 잘못된 통화 금액

Entity Framework에서 데이터 주석 유효성 검사기 사용

Microsoft Entity Framework를 사용하여 데이터 모델 클래스를 생성하는 경우 유효성 검사기 특성을 클래스에 직접 적용할 수 없습니다. Entity Framework Designer 모델 클래스를 생성하므로 다음에 Designer 변경하면 모델 클래스에 대한 변경 내용을 덮어씁니다.

Entity Framework에서 생성된 클래스와 함께 유효성 검사기를 사용하려면 메타 데이터 클래스를 만들어야 합니다. 유효성 검사기를 실제 클래스에 적용하는 대신 메타 데이터 클래스에 유효성 검사기를 적용합니다.

예를 들어 Entity Framework를 사용하여 Movie 클래스를 만들었다고 상상해 보세요( 그림 5 참조). 또한 영화 제목 및 디렉터 속성에 필요한 속성을 만들려는 경우를 상상해 보세요. 이 경우 목록 4에서 partial 클래스 및 메타 데이터 클래스를 만들 수 있습니다.

영화 클래스 이미지

그림 5: Entity Framework에서 생성된 무비 클래스

Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations

 _
Partial Public Class Movie
End Class

Public Class MovieMetaData

    Private _title As Object
    Private _director As Object
    Private _dateReleased As Object

     _
    Public Property Title() As Object
        Get
            Return _title
        End Get
        Set(ByVal value As Object)
            _title = value
        End Set
    End Property

     _
    Public Property Director() As Object
        Get
            Return _director
        End Get
        Set(ByVal value As Object)
            _director = value
        End Set
    End Property

     _
    Public Property DateReleased() As Object
        Get
            Return _dateReleased
        End Get
        Set(ByVal value As Object)
            _dateReleased = value
        End Set
    End Property
End Class

목록 4: Models\Movie.vb

목록 4의 파일에는 Movie 및 MovieMetaData라는 두 개의 클래스가 포함되어 있습니다. Movie 클래스는 partial 클래스입니다. DataModel에 포함된 Entity Framework에서 생성된 부분 클래스에 해당합니다. Designer.vb 파일입니다.

현재 .NET 프레임워크는 부분 속성을 지원하지 않습니다. 따라서 DataModel에 정의된 Movie 클래스의 속성에 유효성 검사기 특성을 적용할 수 있는 방법은 없습니다. 목록 4의 파일에 정의된 Movie 클래스의 속성에 유효성 검사기 특성을 적용하여 Designer.vb 파일입니다.

Movie partial 클래스는 MovieMetaData 클래스를 가리키는 MetadataType 특성으로 데코레이팅됩니다. MovieMetaData 클래스에는 Movie 클래스의 속성에 대한 프록시 속성이 포함되어 있습니다.

유효성 검사기 특성은 MovieMetaData 클래스의 속성에 적용됩니다. Title, Director 및 DateReleased 속성은 모두 필수 속성으로 표시됩니다. Director 속성에는 5자 미만의 문자열이 할당되어야 합니다. 마지막으로 DisplayName 특성이 DateReleased 속성에 적용되어 "DateReleased 필드가 필요합니다." 오류 대신 "날짜 릴리스 필드가 필요합니다."와 같은 오류 메시지를 표시합니다.

참고

MovieMetaData 클래스의 프록시 속성은 Movie 클래스의 해당 속성과 동일한 형식을 나타낼 필요가 없습니다. 예를 들어 Director 속성은 Movie 클래스의 문자열 속성이고 MovieMetaData 클래스의 개체 속성입니다.

그림 6의 페이지에서는 무비 속성에 잘못된 값을 입력할 때 반환되는 오류 메시지를 보여 줍니다.

잘못된 동영상 값 오류 메시지 이미지

그림 6: Entity Framework에서 유효성 검사기 사용(전체 크기 이미지를 보려면 클릭)

요약

이 자습서에서는 데이터 주석 모델 바인더를 활용하여 ASP.NET MVC 애플리케이션 내에서 유효성 검사를 수행하는 방법을 알아보았습니다. 필수 및 StringLength 특성과 같은 다양한 유형의 유효성 검사기 특성을 사용하는 방법을 알아보았습니다. Microsoft Entity Framework를 사용할 때 이러한 특성을 사용하는 방법도 알아보았습니다.