Share via


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

작성자 : Rick Anderson

참고

이 자습서의 업데이트된 버전은 ASP.NET MVC 5 및 Visual Studio 2013 사용하는 여기에서 사용할 수 있습니다. 더 안전하고 따라하기가 훨씬 더 간단하며 더 많은 기능을 보여 줍니다.

이 자습서에서는 무료 버전의 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 필수 구성 요소 링크를 클릭하여 필수 구성 요소를 설치합니다.

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

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

물건을 건조하게 유지

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

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

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

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

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

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

using System.ComponentModel.DataAnnotations;

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

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

public class Movie
{
    public int ID { get; set; }

    [Required(ErrorMessage = "Title is required")]
    public string Title { get; set; }

    [Required(ErrorMessage = "Date is required")]
    public DateTime ReleaseDate { get; set; }

    [Required(ErrorMessage = "Genre must be specified")]
    public string Genre { get; set; }

    [Range(1, 100, ErrorMessage = "Price must be between $1 and $100")]
    public decimal Price { get; set; }

    [StringLength(5)]
    public string Rating { get; set; }
}

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

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

MovieDBContext db = new MovieDBContext();

Movie movie = new Movie();
movie.Title = "Gone with the Wind";
movie.Price = 0.0M;

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

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

다음은 업데이트된 Movie.cs 파일에 대한 전체 코드 목록입니다.

using System;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;

namespace MvcMovie.Models
{
    public class Movie
    {
        public int ID { get; set; }

        [Required(ErrorMessage = "Title is required")]
        public string Title { get; set; }

        public DateTime ReleaseDate { get; set; }

        [Required(ErrorMessage = "Genre must be specified")]
        public string Genre { get; set; }

        [Range(1, 100, ErrorMessage = "Price must be between $1 and $100")]
        public decimal Price { get; set; }

        [StringLength(5)]
        public string Rating { get; set; }
    }

    public class MovieDBContext : DbContext
    {
        public DbSet<Movie> Movies { get; set; }
    }
}

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

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

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

8_validationErrors

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

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

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

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

//
// GET: /Movies/Create

public ActionResult Create()
{
    return View();
}

//
// POST: /Movies/Create

[HttpPost]
public ActionResult Create(Movie movie)
{
    if (ModelState.IsValid)
    {
        db.Movies.Add(movie);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(movie);
}

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

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

@model MvcMovie.Models.Movie
@{
    ViewBag.Title = "Create";
}
<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(model => model.Title)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Title)
            @Html.ValidationMessageFor(model => model.Title)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.ReleaseDate)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ReleaseDate)
            @Html.ValidationMessageFor(model => model.ReleaseDate)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Genre)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Genre)
            @Html.ValidationMessageFor(model => model.Genre)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Price)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Price)
            @Html.ValidationMessageFor(model => model.Price)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Rating)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Rating)
            @Html.ValidationMessageFor(model => model.Rating)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

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

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

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

동영상 모델에 서식 추가

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

[DataType(DataType.Date)] 
public DateTime ReleaseDate { get; set; }

[DataType(DataType.Currency)] 
public decimal Price { get; set; }

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

[DisplayFormat(DataFormatString = "{0:d}")]
public DateTime ReleaseDate { get; set; }

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

[DisplayFormat(DataFormatString = "{0:c}")]
public decimal Price { get; set; }

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

public class Movie
{
    public int ID { get; set; }

    [Required(ErrorMessage = "Title is required")]
    public string Title { get; set; }

    [DisplayFormat(DataFormatString = "{0:d}")]
    public DateTime ReleaseDate { get; set; }

    [Required(ErrorMessage = "Genre must be specified")]
    public string Genre { get; set; }

    [Range(1, 100, ErrorMessage = "Price must be between $1 and $100")]
    [DisplayFormat(DataFormatString = "{0:c}")]
    public decimal Price { get; set; }

    [StringLength(5)]
    public string Rating { get; set; }
}

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

8_format_SM

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