다음을 통해 공유


모델에 유효성 검사 추가(VB)

작성자: Rick Anderson

이 자습서에서는 무료 버전의 Microsoft Visual Studio인 Microsoft Visual Web Developer 2010 Express Service Pack 1을 사용하여 ASP.NET MVC 웹 애플리케이션을 빌드하는 기본 사항을 설명합니다. 시작하기 전에 아래에 나열된 필수 구성 요소를 설치했는지 확인합니다. 웹 플랫폼 설치 관리자 링크를 클릭하여 모두 설치할 수 있습니다. 또는 다음 링크를 사용하여 필수 구성 요소를 개별적으로 설치할 수 있습니다.

Visual Web Developer 2010 대신 Visual Studio 2010을 사용하는 경우 Visual Studio 2010 필수 구성 요소 링크를 클릭하여 필수 구성 요소를 설치합니다.

VB.NET 소스 코드가 있는 Visual Web Developer 프로젝트를 이 항목과 함께 사용할 수 있습니다. VB.NET 버전을 다운로드합니다. C#을 선호하는 경우 이 자습서의 C# 버전 으로 전환합니다.

이 섹션에서는 모델에 유효성 검사 논리를 Movie 추가하고 사용자가 애플리케이션을 사용하여 영화를 만들거나 편집하려고 할 때마다 유효성 검사 규칙이 적용되도록 합니다.

물건을 건조하게 유지

ASP.NET MVC의 핵심 디자인 원칙 중 하나는 DRY("자신을 반복하지 마십시오")입니다. ASP.NET MVC는 기능 또는 동작을 한 번만 지정한 다음 애플리케이션의 모든 위치에 반영하도록 권장합니다. 이렇게 하면 작성해야 하는 코드의 양이 줄어들고 작성할 코드를 훨씬 쉽게 유지 관리할 수 있습니다.

ASP.NET MVC 및 Entity Framework Code First에서 제공하는 유효성 검사 지원은 실행 중인 DRY 원칙의 좋은 예입니다. 모델 클래스의 한 곳에서 유효성 검사 규칙을 선언적으로 지정한 다음 애플리케이션의 모든 위치에서 해당 규칙이 적용됩니다.

영화 애플리케이션에서 이 유효성 검사 지원을 활용하는 방법을 살펴보겠습니다.

영화 모델에 유효성 검사 규칙 추가

먼저 클래스에 몇 가지 유효성 검사 논리를 Movie 추가합니다.

Movie.vb 파일을 엽니다. Imports 네임스페이스를 참조하는 문을 파일 맨 위에 추가합니다.System.ComponentModel.DataAnnotations

Imports System.ComponentModel.DataAnnotations

네임스페이스는 .NET Framework의 일부입니다. 모든 클래스 또는 속성에 선언적으로 적용할 수 있는 기본 제공 유효성 검사 특성 집합을 제공합니다.

이제 기본 제공 RequiredStringLengthRange 유효성 검사 특성을 활용하도록 클래스를 업데이트 Movie 합니다. 특성을 적용할 위치의 예로 다음 코드를 사용합니다.

Public Class Movie
    Public Property ID() As Integer

    <Required(ErrorMessage:="Title is required")>
    Public Property Title() As String

    <Required(ErrorMessage:="Date is required")>
    Public Property ReleaseDate() As Date

    <Required(ErrorMessage:="Genre must be specified")>
    Public Property Genre() As String

    <Required(ErrorMessage:="Price Required"), Range(1, 100, ErrorMessage:="Price must be between $1 and $100")>
    Public Property Price() As Decimal

    <StringLength(5)>
    Public Property Rating() As String
End Class

이 유효성 검사 특성은 적용되는 모델 속성에 시행하려는 동작을 지정합니다. 이 특성은 Required 속성에 값이 있어야 하며, 이 샘플에서는 동영상에 유효하기 위해 , ReleaseDateGenrePrice 속성에 대한 Title값이 있어야 합니다. Range 특성은 값을 지정된 범위 내로 제한합니다. StringLength 특성을 사용하면 문자열 속성의 최대 길이와, 그리고 필요에 따라 최소 길이를 설정할 수 있습니다.

Code First는 애플리케이션이 데이터베이스의 변경 내용을 저장하기 전에 모델 클래스에 지정한 유효성 검사 규칙이 적용되도록 합니다. 예를 들어 아래 코드는 메서드가 호출될 때 SaveChanges 몇 가지 필수 Movie 속성 값이 누락되고 가격이 0(유효한 범위를 벗어났습니다)이므로 예외를 throw합니다.

Dim db As New MovieDBContext()

Dim movie As New Movie()
movie.Title = "Gone with the Wind"
movie.Price = 0.0D

db.Movies.Add(movie)
db.SaveChanges() ' <= Will throw validation exception

.NET Framework에서 유효성 검사 규칙을 자동으로 적용하면 애플리케이션을 더욱 강력하게 만들 수 있습니다. 또한 유효성 검사를 잊거나, 데이터베이스에 불량 데이터가 실수로 들어가지 않게 할 수 있습니다.

업데이트 된 Movie.vb 파일에 대한 전체 코드 목록은 다음과 같습니다.

Imports System.Data.Entity
Imports System.ComponentModel.DataAnnotations

Public Class Movie
    Public Property ID() As Integer

    <Required(ErrorMessage:="Title is required")>
    Public Property Title() As String

    <Required(ErrorMessage:="Date is required")>
    Public Property ReleaseDate() As Date

    <Required(ErrorMessage:="Genre must be specified")>
    Public Property Genre() As String

    <Required(ErrorMessage:="Price Required"), Range(1, 100, ErrorMessage:="Price must be between $1 and $100")>
    Public Property Price() As Decimal

    <StringLength(5)>
    Public Property Rating() As String
End Class

Public Class MovieDBContext
    Inherits DbContext
    Public Property Movies() As DbSet(Of Movie)
End Class

ASP.NET MVC의 유효성 검사 오류 UI

애플리케이션을 다시 실행하고 /Movies URL로 이동합니다.

영화 만들기 링크를 클릭하여 새 동영상을 추가합니다. 양식에 잘못된 값을 입력한 다음 만들기 단추를 클릭합니다.

8_validationErrors

양식에서 배경색을 자동으로 사용하여 잘못된 데이터가 포함된 텍스트 상자를 강조 표시하고 각 데이터 옆에 적절한 유효성 검사 오류 메시지를 내보낸 방법을 확인합니다. 오류 메시지는 클래스에 주석을 추가할 때 지정한 오류 문자열과 일치합니다 Movie . 오류는 클라이언트 쪽(JavaScript 사용) 및 서버 쪽(사용자가 JavaScript를 사용하지 않도록 설정한 경우) 모두 적용됩니다.

실제 이점은 이 유효성 검사 UI를 사용하도록 설정하기 위해 클래스 또는 Create.vbhtml 보기에서 한 줄의 코드를 MoviesController 변경할 필요가 없다는 것입니다. 이 자습서의 앞부분에서 만든 컨트롤러와 뷰는 모델 클래스의 특성을 Movie 사용하여 지정한 유효성 검사 규칙을 자동으로 선택했습니다.

뷰 만들기 및 만들기 작업 메서드에서 유효성 검사가 발생하는 방법

컨트롤러나 보기의 코드를 전혀 수정하지 않고도 어떻게 유효성 검사 UI가 생성되는지 궁금할 것입니다. 다음 목록에서는 클래스의 메서드가 Create MovieController 어떻게 표시되는지 보여 줍니다. 이 자습서의 앞부분에서 만든 방법과는 달라지지 않습니다.

'
' GET: /Movies/Create

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

'
' POST: /Movies/Create

<HttpPost()>
Function Create(movie As Movie) As ActionResult
    If ModelState.IsValid Then
        db.Movies.Add(movie)
        db.SaveChanges()
        Return RedirectToAction("Index")
    End If

    Return View(movie)
End Function

첫 번째 작업 메서드는 초기 만들기 양식을 표시합니다. 두 번째는 양식 게시물을 처리합니다. 두 번째 Create 메서드는 동영상에 유효성 검사 오류가 있는지 여부를 확인하기 위해 호출 ModelState.IsValid 합니다. 이 메서드를 호출하면 개체에 적용된 모든 유효성 검사 특성이 평가됩니다. 개체에 유효성 검사 오류가 있는 경우 메서드는 Create 폼을 다시 표시합니다. 오류가 없으면 메서드가 데이터베이스에 새 영화를 저장합니다.

다음은 자습서의 앞부분에서 스캐폴드한 Create.vbhtml 뷰 템플릿입니다. 이 항목은 위 두 작업 메서드에서 최초 양식을 표시하고 오류 시 다시 표시하기 위해 사용됩니다.

@ModelType MvcMovie.Movie

@Code
    ViewData("Title") = "Create"
End Code

<h2>Create</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@Using Html.BeginForm()
    @Html.ValidationSummary(True)
    @<fieldset>
        <legend>Movie</legend>

        <div class="editor-label">
            @Html.LabelFor(Function(model) model.Title)
        </div>
        <div class="editor-field">
            @Html.EditorFor(Function(model) model.Title)
            @Html.ValidationMessageFor(Function(model) model.Title)
        </div>

        <div class="editor-label">
            @Html.LabelFor(Function(model) model.ReleaseDate)
        </div>
        <div class="editor-field">
            @Html.EditorFor(Function(model) model.ReleaseDate)
            @Html.ValidationMessageFor(Function(model) model.ReleaseDate)
        </div>

        <div class="editor-label">
            @Html.LabelFor(Function(model) model.Genre)
        </div>
        <div class="editor-field">
            @Html.EditorFor(Function(model) model.Genre)
            @Html.ValidationMessageFor(Function(model) model.Genre)
        </div>

        <div class="editor-label">
            @Html.LabelFor(Function(model) model.Price)
        </div>
        <div class="editor-field">
            @Html.EditorFor(Function(model) model.Price)
            @Html.ValidationMessageFor(Function(model) model.Price)
        </div>

 <div class="editor-label">
     @Html.LabelFor(Function(model) model.Rating)
 </div>
 <div class="editor-field">
     @Html.EditorFor(Function(model) model.Rating)
     @Html.ValidationMessageFor(Function(model) model.Rating)
 </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
End Using

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

코드에서 도우미를 Html.EditorFor 사용하여 각 Movie 속성에 대한 요소를 출력하는 <input> 방법을 확인합니다. 이 도우미 옆에는 도우미 메서드에 대한 호출이 Html.ValidationMessageFor 있습니다. 이 두 도우미 메서드는 컨트롤러가 뷰에 전달하는 모델 개체(이 경우 Movie 개체)를 사용합니다. 모델에 지정된 유효성 검사 특성을 자동으로 찾고 오류 메시지를 적절하게 표시합니다.

이 방법의 좋은 점은 컨트롤러나 뷰 만들기 템플릿이 적용되는 실제 유효성 검사 규칙이나 표시되는 특정 오류 메시지에 대해 아무것도 알지 못한다는 것입니다. 유효성 검사 규칙 및 오류 문자열은 Movie 클래스에서만 지정됩니다.

나중에 유효성 검사 논리를 변경하려는 경우 정확히 한 곳에서 변경할 수 있습니다. 모든 유효성 검사 논리가 한 곳에서 정의되어 모든 곳에서 사용되므로 애플리케이션의 서로 다른 부분이 규칙 적용 방법에 부합하는지 우려하지 않아도 됩니다. 이렇게 하면 코드가 매우 깔끔해지고 유지 관리 및 확장이 간편합니다. 또한 반복 금지 원칙에 완전히 부합하게 됩니다.

영화 모델에 서식 추가

Movie.vb 파일을 엽니다. System.ComponentModel.DataAnnotations 네임스페이스는 기본 제공 유효성 검사 특성 모음 외에도 서식 특성을 제공합니다. 릴리스 날짜 및 가격 필드에 특성 및 DataType 열거형 값을 적용 DisplayFormat 합니다. 다음 코드는에서는 ReleaseDatePrice 속성과 적합한 DisplayFormat 특성을 보여줍니다.

<DataType(DataType.Date)>
    Public Property ReleaseDate() As Date

     <DataType(DataType.Currency)>
    Public Property Price() As Decimal

또는 명시적으로 값을 설정할 수 있습니다 DataFormatString . 다음 코드는 날짜 형식 문자열(즉, "d")이 있는 릴리스 날짜 속성을 보여 줍니다. 릴리스 날짜의 일부로 시간을 지정하지 않도록 지정하는 데 사용합니다.

<DisplayFormat(DataFormatString:="{0:d}")>
    Public Property ReleaseDate() As Date

다음 코드는 속성을 통화 형식으로 지정합니다 Price .

<DisplayFormat(DataFormatString:="{0:c}")>
    Public Property Price() As Decimal

전체 Movie 클래스는 다음과 같습니다.

Public Class Movie
    Public Property ID() As Integer

    <Required(ErrorMessage:="Title is required")>
    Public Property Title() As String

    <Required(ErrorMessage:="Date is required")>
    <DataType(DataType.Date)>
    Public Property ReleaseDate() As Date

    <Required(ErrorMessage:="Genre must be specified")>
    Public Property Genre() As String

    <Required(ErrorMessage:="Price Required"), Range(1, 100, ErrorMessage:="Price must be between $1 and $100")>
    <DataType(DataType.Currency)>
    Public Property Price() As Decimal

    <StringLength(5)>
    Public Property Rating() As String
End Class

애플리케이션을 실행하고 컨트롤러로 찾습니다 Movies .

8_format_SM

시리즈의 다음 부분에서는 애플리케이션을 검토하고 자동으로 생성된 Details 메서드와 Delete 메서드를 몇 가지 개선합니다.