ASP.NET Core MVC에서 모델 유효성 검사 소개Introduction to model validation in ASP.NET Core MVC

으로 Rachel AppelBy Rachel Appel

모델 유효성 검사 소개Introduction to model validation

응용 프로그램 데이터베이스에 데이터를 저장 하기 전에 응용 프로그램 데이터를 확인 해야 합니다.Before an app stores data in a database, the app must validate the data. 데이터 유형 및 크기로 적절 하 게 서식이 지정을 여 규칙을 준수 해야 하는 잠재적 보안 위협을 확인 해야 합니다.Data must be checked for potential security threats, verified that it is appropriately formatted by type and size, and it must conform to your rules. 중복 되 고 구현 하기 번거로운 울 수 있지만 유효성 검사는 필요 합니다.Validation is necessary although it can be redundant and tedious to implement. Mvc에서 유효성 검사는 클라이언트와 서버 모두에서 발생합니다.In MVC, validation happens on both the client and server.

다행히.NET에 유효성 검사 특성에 대 한 유효성 검사를 추상화 합니다.Fortunately, .NET has abstracted validation into validation attributes. 이러한 특성에는 유효성 검사 코드를 작성 해야 하는 코드의 양을 줄이는 포함 합니다.These attributes contain validation code, thereby reducing the amount of code you must write.

보기 또는 GitHub에서 샘플을 다운로드합니다.View or download sample from GitHub.

유효성 검사 특성Validation Attributes

유효성 검사 특성은 데이터베이스 테이블의 필드에 유효성 검사를 개념적으로 유사 하므로 모델 유효성 검사를 구성 하는 방법입니다.Validation attributes are a way to configure model validation so it's similar conceptually to validation on fields in database tables. 데이터 형식이 나 필수 필드를 할당 하는 등 제약 조건을 포함 됩니다.This includes constraints such as assigning data types or required fields. 다른 종류의 유효성 검사 전자 메일 주소 또는 전화 번호, 신용 카드와 같은 비즈니스 규칙을 적용 하는 데이터 패턴을 적용 하는 합니다.Other types of validation include applying patterns to data to enforce business rules, such as a credit card, phone number, or email address. 유효성 검사 특성 확인 훨씬 간단 하 고 사용 하기 쉽게 이러한 요구 사항을 적용 합니다.Validation attributes make enforcing these requirements much simpler and easier to use.

다음은 이러한는 주석이 추가 된 Movie 동영상과 TV 프로그램에 대 한 정보를 저장 하는 응용 프로그램에서 모델입니다.Below is an annotated Movie model from an app that stores information about movies and TV shows. 대부분의 속성 필요 하며 여러 문자열 속성에는 길이 요구 사항이입니다.Most of the properties are required and several string properties have length requirements. 또한는에 대 한 숫자 범위 제한이 Price 속성을 0에서 $999.99, 사용자 지정 유효성 검사 특성을 합니다.Additionally, there is a numeric range restriction in place for the Price property from 0 to $999.99, along with a custom validation attribute.

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

    [Required]
    [StringLength(100)]
    public string Title { get; set; }

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

    [Required]
    [StringLength(1000)]
    public string Description { get; set; }

    [Range(0, 999.99)]
    public decimal Price { get; set; }

    [Required]
    public Genre Genre { get; set; }

    public bool Preorder { get; set; }
}

단순히 모델을 통해 읽을 쉽게 코드를 유지 하기 위해이 앱에 대 한 데이터에 대 한 규칙이 표시 됩니다.Simply reading through the model reveals the rules about data for this app, making it easier to maintain the code. 다음은 여러 인기 있는 기본 제공 유효성 검사 특성입니다.Below are several popular built-in validation attributes:

  • [CreditCard]: 유효성을 검사 속성에는 신용 카드 형식입니다.[CreditCard]: Validates the property has a credit card format.

  • [Compare]: 일치 하는 모델 항목에 두 속성의 유효성을 검사 합니다.[Compare]: Validates two properties in a model match.

  • [EmailAddress]: 유효성을 검사 속성에는 전자 메일 형식입니다.[EmailAddress]: Validates the property has an email format.

  • [Phone]: 유효성을 검사 속성에는 전화 형식입니다.[Phone]: Validates the property has a telephone format.

  • [Range]: 지정된 된 범위 내에서 속성 값 변경의 유효성을 검사 합니다.[Range]: Validates the property value falls within the given range.

  • [RegularExpression]: 데이터에 지정된 된 정규식과 일치 하는지 확인 합니다.[RegularExpression]: Validates that the data matches the specified regular expression.

  • [Required]: 필수 속성으로 설정 합니다.[Required]: Makes a property required.

  • [StringLength]: 문자열 속성에 지정 된 최대 길이 최대 있는지 확인 합니다.[StringLength]: Validates that a string property has at most the given maximum length.

  • [Url]: 유효성을 검사 속성이 URL 형식입니다.[Url]: Validates the property has a URL format.

MVC에서 파생 된 모든 특성을 지원 ValidationAttribute 유효성 검사를 위해서입니다.MVC supports any attribute that derives from ValidationAttribute for validation purposes. 많은 유용한 유효성 검사 특성에서 확인할 수 있습니다는 System.ComponentModel.DataAnnotations 네임 스페이스입니다.Many useful validation attributes can be found in the System.ComponentModel.DataAnnotations namespace.

제공 하는 기본 제공 특성 보다 더 많은 기능을 할 수 있는 인스턴스가 있을 수 있습니다.There may be instances where you need more features than built-in attributes provide. 해당 시간에 대 한 사용자 지정 유효성 검사 특성에서 파생 하 여 만들 수 있습니다 ValidationAttribute 구현 하 여 모델을 변경 하거나 IValidatableObject합니다.For those times, you can create custom validation attributes by deriving from ValidationAttribute or changing your model to implement IValidatableObject.

필수 특성의 사용에 대 한 참고 사항Notes on the use of the Required attribute

비 null을 허용 하지 값 형식 (같은 decimal, int, float, 및 DateTime)이 기본적으로 필요 하 고 필요 하지 않습니다는 Required 특성입니다.Non-nullable value types (such as decimal, int, float, and DateTime) are inherently required and don't need the Required attribute. 표시 된 null이 아닌 형식에 대 한 없는 서버 쪽 유효성 검사를 수행 하는 응용 프로그램 Required합니다.The app performs no server-side validation checks for non-nullable types that are marked Required.

MVC 모델 바인딩 유효성 검사 및 유효성 검사 특성으로 관련 되지 않습니다는 누락 값 또는 공백 nullable이 아닌 형식에 대 한 포함 된 양식 필드 전송을 거부 합니다.MVC model binding, which isn't concerned with validation and validation attributes, rejects a form field submission containing a missing value or whitespace for a non-nullable type. 없는 경우에는 BindRequired 특성 모델 바인딩 대상 속성에 양식 필드 없는 nullable이 아닌 형식에 대 한 누락 된 데이터를 무시에서 들어오는 양식 데이터입니다.In the absence of a BindRequired attribute on the target property, model binding ignores missing data for non-nullable types, where the form field is absent from the incoming form data.

BindRequired 특성 (참조도 특성으로 모델 바인딩 동작 사용자 지정)는 양식 데이터를 완료 하는 데 유용 합니다.The BindRequired attribute (also see Customize model binding behavior with attributes) is useful to ensure form data is complete. 속성에 적용 하는 경우 모델 바인딩 시스템이 해당 속성에 대 한 값이 필요 합니다.When applied to a property, the model binding system requires a value for that property. 형식에 적용 하는 경우 모델 바인딩 시스템이 모든 해당 형식의 속성에 대 한 값이 필요 합니다.When applied to a type, the model binding system requires values for all of the properties of that type.

사용 하는 경우는 Nullable<T > 형식 (예를 들어 decimal? 또는 System.Nullable<decimal>) 하 고 표시 Required, 속성 (nullable 표준 형식인 경우 처럼 서버 쪽 유효성 검사가 수행 됩니다 예제에서는 한 string).When you use a Nullable<T> type (for example, decimal? or System.Nullable<decimal>) and mark it Required, a server-side validation check is performed as if the property were a standard nullable type (for example, a string).

클라이언트 쪽 유효성 검사 모델 속성을 표시 한에 해당 하는 양식 필드의 값이 필요 Required 하 고 nullable이 아닌 형식 속성으로 표시 하지 않은 Required합니다.Client-side validation requires a value for a form field that corresponds to a model property that you've marked Required and for a non-nullable type property that you haven't marked Required. Required클라이언트 쪽 유효성 검사 오류 메시지를 제어 하 사용할 수 있습니다.Required can be used to control the client-side validation error message.

모델 상태Model State

모델 상태 제출 된 HTML 폼 값의 유효성 검사 오류를 나타냅니다.Model state represents validation errors in submitted HTML form values.

MVC는 계속 필드에 도달할 때까지 유효성 검사 오류 (기본적으로 200)의 최대 수입니다.MVC will continue validating fields until reaches the maximum number of errors (200 by default). 다음 코드를 삽입 하 여이 번호를 구성할 수 있습니다는 ConfigureServices 에서 메서드는 Startup.cs 파일:You can configure this number by inserting the following code into the ConfigureServices method in the Startup.cs file:

services.AddMvc(options => options.MaxModelValidationErrors = 50);

처리 모델 상태 오류Handling Model State Errors

모델 유효성 검사가 호출 되는 각 컨트롤러 동작 하기 전에 발생 하 고 검사 해야 하는 작업 메서드의 ModelState.IsValid 하 고 적절 하 게 대처 합니다.Model validation occurs prior to each controller action being invoked, and it is the action method’s responsibility to inspect ModelState.IsValid and react appropriately. 대부분의 경우에서 적합 한 반응 이상적 모델 유효성 검사에 실패 한 이유를 자세히 설명 하는 오류 응답의 몇 가지 종류를 반환 하는 것입니다.In many cases, the appropriate reaction is to return some kind of error response, ideally detailing the reason why model validation failed.

모델 유효성 검사 오류,이 경우 필터 수 이어야 이러한 정책을 구현 하는 적절 한 위치를 처리 하기 위한 표준 규칙을 따르는 일부 응용 프로그램을 선택 합니다.Some apps will choose to follow a standard convention for dealing with model validation errors, in which case a filter may be an appropriate place to implement such a policy. 유효 하지 않은 모델 상태와 작업을 수행할 때 동작 하는 방법을 테스트 해야 합니다.You should test how your actions behave with valid and invalid model states.

수동 유효성 검사Manual validation

모델 바인딩 및 유효성 검사 완료 되 면 일부를 반복 하는 것이 좋습니다.After model binding and validation are complete, you may want to repeat parts of it. 예를 들어, 사용자, 정수가 필요한 필드에 텍스트 입력 한 수 또는 모델의 속성에 대 한 값을 계산 해야 할 수 있습니다.For example, a user may have entered text in a field expecting an integer, or you may need to compute a value for a model's property.

유효성 검사를 수동으로 실행 해야 합니다.You may need to run validation manually. 이렇게 하려면 호출 된 TryValidateModel 메서드를 다음과 같이 합니다.To do so, call the TryValidateModel method, as shown here:

TryValidateModel(movie);

사용자 지정 유효성 검사Custom validation

유효성 검사 특성에 대 한 대부분의 유효성 검사 요구 사항을 사용 됩니다.Validation attributes work for most validation needs. 그러나 일부 유효성 검사 규칙은 있지 않는 방금 필드를 확인 하는 등 일반 데이터 유효성 검사를 수행할지 또는 값의 범위를 따르는지으로 비즈니스에 관련이 있습니다.However, some validation rules are specific to your business, as they're not just generic data validation such as ensuring a field is required or that it conforms to a range of values. 이러한 시나리오에 대 한 사용자 지정 유효성 검사 특성은이 가장 좋은 방법입니다.For these scenarios, custom validation attributes are a great solution. MVC에서 사용자 고유의 사용자 지정 유효성 검사 특성을 만들기 쉽습니다.Creating your own custom validation attributes in MVC is easy. 상속 하는 것은 ValidationAttribute, 재정의 IsValid 메서드.Just inherit from the ValidationAttribute, and override the IsValid method. IsValid 메서드는 두 개의 매개 변수를 첫 번째는 라는 개체 고 두 번째는 ValidationContext 라는 개체 validationContext합니다.The IsValid method accepts two parameters, the first is an object named value and the second is a ValidationContext object named validationContext. 지정 유효성 검사기의 유효성을 검사할 필드의 실제 값을 나타냅니다.Value refers to the actual value from the field that your custom validator is validating.

다음 샘플에서는 비즈니스 규칙에 따르면 사용자가 장르를 설정 하지 않을 수 있습니다 클래식 1960 이후에 출시 동영상에 대 한 합니다.In the following sample, a business rule states that users may not set the genre to Classic for a movie released after 1960. [ClassicMovie] 특성 장르를 먼저 확인 하 고 기존 인 경우 다음 검사 릴리스 날짜 이후 1960 중인지 확인 합니다.The [ClassicMovie] attribute checks the genre first, and if it is a classic, then it checks the release date to see that it is later than 1960. 1960 후 해제 되 면 유효성 검사가 실패 합니다.If it is released after 1960, validation fails. 특성은 데이터 유효성을 검사 하는 데 사용할 수 있는 연도 나타내는 정수 매개 변수를 허용 합니다.The attribute accepts an integer parameter representing the year that you can use to validate data. 다음과 같이 특성의 생성자에서 매개 변수의 값을 캡처할 수 있습니다.You can capture the value of the parameter in the attribute's constructor, as shown here:

public class ClassicMovieAttribute : ValidationAttribute, IClientModelValidator
{
    private int _year;

    public ClassicMovieAttribute(int Year)
    {
        _year = Year;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        Movie movie = (Movie)validationContext.ObjectInstance;

        if (movie.Genre == Genre.Classic && movie.ReleaseDate.Year > _year)
        {
            return new ValidationResult(GetErrorMessage());
        }

        return ValidationResult.Success;
    }

movie 나타냅니다 위에 변수는 Movie 유효성을 검사할 양식 전송에서 데이터를 포함 하는 개체입니다.The movie variable above represents a Movie object that contains the data from the form submission to validate. 이 경우 유효성 검사를 확인 하는 날짜에 장르는 IsValid 의 메서드는 ClassicMovieAttribute 규칙에 따라 클래스입니다.In this case, the validation code checks the date and genre in the IsValid method of the ClassicMovieAttribute class as per the rules. 유효성을 검사 IsValid 반환는 ValidationResult.Success 코드 시점과 유효성 검사에 실패 한 ValidationResult 오류 메시지와 함께 합니다.Upon successful validation IsValid returns a ValidationResult.Success code, and when validation fails, a ValidationResult with an error message. 사용자가 수정 하는 경우는 Genre 필드에서 폼을 전송 하 고는 IsValid 의 메서드는 ClassicMovieAttribute 영화 기존 인지 확인 합니다.When a user modifies the Genre field and submits the form, the IsValid method of the ClassicMovieAttribute will verify whether the movie is a classic. 기본 제공 특성과 마찬가지로 적용 된 ClassicMovieAttribute 와 같은 속성에 ReleaseDate 앞의 코드 예제에 표시 된 대로 발생 하는 유효성 검사를 진행 하려면.Like any built-in attribute, apply the ClassicMovieAttribute to a property such as ReleaseDate to ensure validation happens, as shown in the previous code sample. 이 예제 에서만 작동 하므로 Movie 형식, 더 나은 옵션은 사용 하 IValidatableObject 다음 단락에서 표시 된 것 처럼 합니다.Since the example works only with Movie types, a better option is to use IValidatableObject as shown in the following paragraph.

구현 하 여 모델에이 동일한 코드에 배치 수는 또는 Validate 에서 메서드는 IValidatableObject 인터페이스입니다.Alternatively, this same code could be placed in the model by implementing the Validate method on the IValidatableObject interface. 사용자 지정 유효성 검사 특성을 개별 속성 유효성 검사 잘 작동 하는 동안 구현 IValidatableObject 는 다음 그림과 같이 클래스 수준 유효성 검사를 구현 하는 데 사용할 수 있습니다.While custom validation attributes work well for validating individual properties, implementing IValidatableObject can be used to implement class-level validation as seen here.

    {
        if (Genre == Genre.Classic && ReleaseDate.Year > _classicYear)
        {
            yield return new ValidationResult(
                $"Classic movies must have a release year earlier than {_classicYear}.",
                new[] { "ReleaseDate" });
        }
    }
}

클라이언트 쪽 유효성 검사Client side validation

클라이언트 쪽 유효성 검사는 사용자에 대 한 매우 편리 합니다.Client side validation is a great convenience for users. 시간을 절약 그렇지 않은 경우 많은 비용이 들어가는지는 왕복에 대 한 대기 중인 서버.It saves time they would otherwise spend waiting for a round trip to the server. 비즈니스 관계에서 몇 초 부분을 곱한 수백 번 매일 추가 최대 많은 시간과 비용, 노력 합니다.In business terms, even a few fractions of seconds multiplied hundreds of times each day adds up to be a lot of time, expense, and frustration. 간단 하 고 즉시 유효성 검사를 사용 하면 보다 효율적으로 작동 하 고 더 좋은 품질 입력 및 출력을 생성할 수 있습니다.Straightforward and immediate validation enables users to work more efficiently and produce better quality input and output.

여기에 표시 된 대로 작동 하도록 클라이언트 쪽 유효성 검사에 대 한 위치에서 적절 한 JavaScript 스크립트 참조 하 여 뷰에 있어야 합니다.You must have a view with the proper JavaScript script references in place for client side validation to work as you see here.

<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.2.0.min.js"></script>
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.16.0/jquery.validate.min.js"></script>
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.6/jquery.validate.unobtrusive.min.js"></script>

MVC는 데이터 유효성 검사 및 JavaScript를 사용 하 여 오류 메시지를 표시 하려면 모델 속성의 형식 메타 데이터 외에도 유효성 검사 특성을 사용 합니다.MVC uses validation attributes in addition to type metadata from model properties to validate data and display any error messages using JavaScript. MVC 폼 요소에서 사용 하 여 모델을 렌더링을 사용 하는 경우 태그 도우미 또는 HTML 도우미 HTML 5를 추가 합니다 데이터 특성 로 유효성 검사를 필요로 하는 폼 요소에서 다음과 같습니다.When you use MVC to render form elements from a model using Tag Helpers or HTML helpers it will add HTML 5 data- attributes in the form elements that need validation, as shown below. MVC에서는 오류가 발생 하는 data- 기본 제공 및 사용자 지정 특성에 대 한 특성입니다.MVC generates the data- attributes for both built-in and custom attributes. 다음과 같이 관련 태그 도우미를 사용 하 여 클라이언트에서 유효성 검사 오류를 표시할 수 있습니다.You can display validation errors on the client using the relevant tag helpers as shown here:

<div class="form-group">
    <label asp-for="ReleaseDate" class="col-md-2 control-label"></label>
    <div class="col-md-10">
        <input asp-for="ReleaseDate" class="form-control" />
        <span asp-validation-for="ReleaseDate" class="text-danger"></span>
    </div>
</div>

위의 태그 도우미 아래 HTML을 렌더링합니다.The tag helpers above render the HTML below. 다음에 유의 data- HTML의 특성에 대 한 유효성 검사 특성에 해당 출력은 ReleaseDate 속성입니다.Notice that the data- attributes in the HTML output correspond to the validation attributes for the ReleaseDate property. data-val-required 릴리스 날짜 필드에 사용자 이름을 입력 하지 않는 경우에 함께 제공 되는 메시지가 표시 됩니다. 표시할 오류 메시지를 포함 하는 특성을 아래 <걸쳐 > 요소입니다.The data-val-required attribute below contains an error message to display if the user doesn't fill in the release date field, and that message displays in the accompanying <span> element.

<form action="/Movies/Create" method="post">
    <div class="form-horizontal">
        <h4>Movie</h4>
        <div class="text-danger"></div>
        <div class="form-group">
            <label class="col-md-2 control-label" for="ReleaseDate">ReleaseDate</label>
            <div class="col-md-10">
                <input class="form-control" type="datetime"
                data-val="true" data-val-required="The ReleaseDate field is required."
                id="ReleaseDate" name="ReleaseDate" value="" />
                <span class="text-danger field-validation-valid"
                data-valmsg-for="ReleaseDate" data-valmsg-replace="true"></span>
            </div>
        </div>
    </div>
</form>

폼이 유효한 될 때까지 전송을 방지 하는 클라이언트 쪽 유효성 검사 합니다.Client-side validation prevents submission until the form is valid. 제출 단추가 양식을 전송 또는 오류 메시지를 표시 하는 JavaScript를 실행 합니다.The Submit button runs JavaScript that either submits the form or displays error messages.

MVC 유형 특성 값을 사용 하 여를 재정의할 수 있는 속성의.NET 데이터 형식을 기반으로 결정 [DataType] 특성입니다.MVC determines type attribute values based on the .NET data type of a property, possibly overridden using [DataType] attributes. 기본 [DataType] 특성 실제 서버 쪽 유효성 검사가 수행 되지 않습니다.The base [DataType] attribute does no real server-side validation. 그러나 브라우저 자신의 오류 메시지를 선택 하 고 만들려는, jQuery 유효성 검사 비간섭 패키지는 메시지를 무시 하 고 다른 사용자와 일관 되 게 표시 수도 있지만 이러한 오류를 표시 합니다.Browsers choose their own error messages and display those errors however they wish, however the jQuery Validation Unobtrusive package can override the messages and display them consistently with others. 사용자를 적용할 때 가장 분명 이런 [DataType] 하위 클래스와 같은 [EmailAddress]합니다.This happens most obviously when users apply [DataType] subclasses such as [EmailAddress].

IClientModelValidatorIClientModelValidator

사용자 지정 특성에 대 한 클라이언트 쪽 논리를 만들 수 있습니다 및 비간섭 유효성 검사 클라이언트에 유효성 검사의 일부로 자동으로 실행 됩니다.You may create client side logic for your custom attribute, and unobtrusive validation will execute it on the client for you automatically as part of validation. 첫 번째 단계를 구현 하 여 어떤 데이터 특성 추가 제어 하는 것은 IClientModelValidator 다음과 같이 인터페이스:The first step is to control what data- attributes are added by implementing the IClientModelValidator interface as shown here:

public void AddValidation(ClientModelValidationContext context)
{
    if (context == null)
    {
        throw new ArgumentNullException(nameof(context));
    }

    MergeAttribute(context.Attributes, "data-val", "true");
    MergeAttribute(context.Attributes, "data-val-classicmovie", GetErrorMessage());

    var year = _year.ToString(CultureInfo.InvariantCulture);
    MergeAttribute(context.Attributes, "data-val-classicmovie-year", year);
}

이 인터페이스를 구현 하는 특성이 생성 된 필드를 HTML 특성을 추가할 수 있습니다.Attributes that implement this interface can add HTML attributes to generated fields. 에 대 한 출력을 검사 하는 ReleaseDate 요소는 이전 예제와 비슷하지만 이제는 HTML을 표시는 data-val-classicmovie 에 정의 된 특성의 AddValidation 방식의 IClientModelValidator합니다.Examining the output for the ReleaseDate element reveals HTML that is similar to the previous example, except now there is a data-val-classicmovie attribute that was defined in the AddValidation method of IClientModelValidator.

<input class="form-control" type="datetime"
    data-val="true"
    data-val-classicmovie="Classic movies must have a release year earlier than 1960."
    data-val-classicmovie-year="1960"
    data-val-required="The ReleaseDate field is required."
    id="ReleaseDate" name="ReleaseDate" value="" />

비 가시적인 유효성 검사에서 데이터를 사용 하는 data- 특성 오류 메시지를 표시 합니다.Unobtrusive validation uses the data in the data- attributes to display error messages. 그러나 jQuery 규칙을 인식 하지 못합니다 또는 jQuery의에 추가 될 때까지 메시지 validator 개체입니다.However, jQuery doesn't know about rules or messages until you add them to jQuery's validator object. 라는 메서드를 추가 하는 아래 예제에서이 확인할 classicmovie jQuery로 사용자 지정 클라이언트 유효성 검사 코드가 포함 된 validator 개체입니다.This is shown in the example below that adds a method named classicmovie containing custom client validation code to the jQuery validator object.

$(function () {
    jQuery.validator.addMethod('classicmovie',
        function (value, element, params) {
            // Get element value. Classic genre has value '0'.
            var genre = $(params[0]).val(),
                year = params[1],
                date = new Date(value);
            if (genre && genre.length > 0 && genre[0] === '0') {
                // Since this is a classic movie, invalid if release date is after given year.
                return date.getFullYear() <= year;
            }

            return true;
        });

    jQuery.validator.unobtrusive.adapters.add('classicmovie',
        [ 'element', 'year' ],
        function (options) {
            var element = $(options.form).find('select#Genre')[0];
            options.rules['classicmovie'] = [element, parseInt(options.params['year'])];
            options.messages['classicmovie'] = options.message;
        });
}(jQuery));

이제 jQuery 유효성 검사 코드는 false를 반환 하는 경우 표시할 오류 메시지 뿐 아니라 사용자 지정 JavaScript 유효성 검사를 실행 하는 정보를 있습니다.Now jQuery has the information to execute the custom JavaScript validation as well as the error message to display if that validation code returns false.

원격 유효성 검사Remote validation

원격 유효성 검사는 서버에서 데이터에 대 한 클라이언트에서 데이터의 유효성을 검사 해야 할 때 사용할 수 있는 유용한 기능입니다.Remote validation is a great feature to use when you need to validate data on the client against data on the server. 예를 들어 앱 여부는 전자 메일 또는 사용자 이름이 이미 사용에서 되 고 많은 양의 데이터를 쿼리해야 할 수 있습니다.For example, your app may need to verify whether an email or user name is already in use, and it must query a large amount of data to do so. 하나는 유효성 검사에 대 한 데이터 집합 다운로드 큰 또는 할 필드가 단 몇 너무 많은 리소스를 소비 합니다.Downloading large sets of data for validating one or a few fields consumes too many resources. 중요 한 정보를 노출할 수 있습니다.It may also expose sensitive information. 필드의 유효성을 검사 하는 왕복 요청 하는 대신이입니다.An alternative is to make a round-trip request to validate a field.

2 단계 프로세스에서 원격 유효성 검사를 구현할 수 있습니다.You can implement remote validation in a two step process. 첫째, 주석으로 처리 해야 사용 하 여 모델의 [Remote] 특성입니다.First, you must annotate your model with the [Remote] attribute. [Remote] 특성 직접 클라이언트 쪽 JavaScript는 해당 코드를 호출 하는 데 사용할 수 있는 여러 오버 로드를 허용 합니다.The [Remote] attribute accepts multiple overloads you can use to direct client side JavaScript to the appropriate code to call. 이 예제에서는 가리키는 VerifyEmail 의 동작 메서드는 Users 컨트롤러입니다.The example points to the VerifyEmail action method of the Users controller.

public class User
{
    [Remote(action: "VerifyEmail", controller: "Users")]
    public string Email { get; set; }

두 번째 단계는 지정 하는 것 유효성 검사 코드는 해당 작업 메서드에서 정의 된 대로 [Remote] 특성입니다.The second step is putting the validation code in the corresponding action method as defined in the [Remote] attribute. 반환 된 JsonResult 클라이언트 쪽 계속 일시 중지 하 고 필요한 경우 오류를 표시 하는 데 사용할 수 있는 합니다.It returns a JsonResult that the client side can use to proceed or pause and display an error if needed.

[AcceptVerbs("Get", "Post")]
public IActionResult VerifyEmail(string email)
{
    if (!_userRepository.VerifyEmail(email))
    {
        return Json($"Email {email} is already in use.");
    }

    return Json(true);
}

그러면 사용자가 전자 메일을 입력 하면 보기에는 JavaScript 메일 수행 된 경우 참조에 대 한 원격 호출에서는 이제 및 오류 메시지가 표시 됩니다.Now when users enter an email, JavaScript in the view makes a remote call to see if that email has been taken, and if so, then displays the error message. 그렇지 않으면 사용자는 일반적으로 폼을 제출할 수 있습니다.Otherwise, the user can submit the form as usual.