수색…


소개

Data Annotations를 모델 클래스에 추가하여 애플리케이션에 검증을 추가 할 수 있습니다. Data Annotations를 사용하면 모델 속성에 적용 할 규칙을 설명 할 수 있으며 ASP.NET MVC는이를 적용하고 사용자에게 적절한 메시지를 표시합니다.

ViewModel에서 사용되는 기본 유효성 검사 속성

모델

using System.ComponentModel.DataAnnotations;

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

    [StringLength(14, MinimumLength = 14, ErrorMessage = "Invalid Phone Number")]
    [Required(ErrorMessage="Phone Number is required")] 
    public string PhoneNo { get; set; }

    [Range(typeof(decimal), "0", "150")]
    public decimal? Age { get; set; }

    [RegularExpression(@"^\d{5}(-\d{4})?$", ErrorMessage = "Invalid Zip Code.")]
    public string ZipCode {get;set;}

    [EmailAddress(ErrorMessage = "Invalid Email Address")] 
    public string Email { get; set; }

    [Editable(false)] 
    public string Address{ get; set; }
}

전망

// Include Jquery and Unobstructive Js here for client side validation

@using (Html.BeginForm("Index","Home") { 

    @Html.TextBoxFor(model => model.Name) 
    @Html.ValidationMessageFor(model => model.Name)

    @Html.TextBoxFor(model => model.PhoneNo)
    @Html.ValidationMessageFor(model => model.PhoneNo)

    @Html.TextBoxFor(model => model.Age)
    @Html.ValidationMessageFor(model => model.Age)

    @Html.TextBoxFor(model => model.ZipCode)
    @Html.ValidationMessageFor(model => model.ZipCode)

    @Html.TextBoxFor(model => model.Email)
    @Html.ValidationMessageFor(model => model.Email)

    @Html.TextBoxFor(model => model.Address)
    @Html.ValidationMessageFor(model => model.Address)

    <input type="submit" value="submit" />
}

제어 장치

public ActionResult Index(ViewModel _Model) 
{ 
    // Checking whether the Form posted is valid one. 
    if(ModelState.IsValid) 
    { 
        // your model is valid here.
        // perform any actions you need to, like database actions,
        // and/or redirecting to other controllers and actions.
    }
    else 
    {
        // redirect to same action
        return View(_Model);
    } 
}

원격 검증

서버 측에 ajax 요청을 보내 확인하여 입력 컨트롤에 입력 된 내용이 유효한지 여부를 확인하는 데 사용되는 원격 유효성 검사.

RemoteAttribute 는 클라이언트에서 AJAX 호출을 유효성 검사중인 필드의 값으로 컨트롤러 조치로 작성하여 작동합니다. 제어기 조치는 유효성 검증 성공 또는 실패를 나타내는 JsonResult 응답을 리턴합니다. 작업에서 true 를 반환하면 유효성 검사가 통과되었음을 나타냅니다. 다른 값은 실패를 나타냅니다. false 를 반환하면 속성에 지정된 오류 메시지가 사용됩니다. 문자열이나 정수와 같은 다른 것을 반환하면 오류 메시지로 표시됩니다. 오류 메시지가 동적 인 경우를 제외하고는 true 또는 false를 반환하고 유효성 검사기가 특성에 지정된 오류 메시지를 사용하도록하는 것이 좋습니다.

ViewModel

public class ViewModel
{
    [Remote("IsEmailAvailable", "Group", HttpMethod = "POST", ErrorMessage = "Email already exists. Please enter a different email address.")]
    public string Email{ get; set; }
}

제어 장치

[HttpPost]
public JsonResult IsEmailAvailable(string Email)
{
    // Logic to check whether email is already registered or Not.
    var emailExists = IsEmailRegistered();
    return Json(!emailExists);         
} 

라이브 데모 바이올린

RemoteAttributeAdditionalFields 속성을 사용하여 모델의 AdditionalFields 속성을 컨트롤러 메서드에 전달할 수 있습니다. 전형적인 시나리오는 컨트롤러 논리가 기존 레코드의 값을 무시할 수 있도록 모델의 ID 속성을 '편집'형식으로 전달하는 것입니다.

모델

  public int? ID { get; set; }
  [Display(Name = "Email address")]
  [DataType(DataType.EmailAddress)]
  [Required(ErrorMessage = "Please enter you email address")]
  [Remote("IsEmailAvailable", HttpMethod="Post", AdditionalFields="ID", ErrorMessage = "Email already exists. Please enter a different email address.")]  
  public string Email { get; set; }

제어 장치

[HttpPost]
public ActionResult Validate(string email, int? id)
{
    if (id.HasValue)
    {
        return Json(!db.Users.Any(x => x.Email == email && x.ID != id);
    }
    else
    {
        return Json(!db.Users.Any(x => x.Email == email);
    }
}

실무 데모 - 추가 필드

추가 참고 사항

RemoteAttribute 사용할 때 기본 오류 메시지는 모호하게 이해되므로 항상 기본 오류 메시지를 무시해야합니다.

RequiredAttribute

Required 속성은 속성이 필요함을 지정합니다. 속성의 ErrorMessage 등록 정보를 사용하여 오류 메시지를 지정할 수 있습니다.

먼저 네임 스페이스를 추가하십시오.

using System.ComponentModel.DataAnnotations;

속성에 특성을 적용합니다.

public class Product
{
   [Required(ErrorMessage = "The product name is required.")]
   public string Name { get; set; }

   [Required(ErrorMessage = "The product description is required.")]
   public string Description { get; set; }
}

또한 전역 화 된 응용 프로그램의 오류 메시지에 자원을 사용할 수도 있습니다. 이 경우, ErrorMessageResourceName 자원 클래스 (의 리소스 키를 지정해야합니다 resx 온 살고 있고해야 파일) ErrorMessageResourceType :

public class Product
{
   [Required(ErrorMessageResourceName = "ProductNameRequired", 
             ErrorMessageResourceType = typeof(ResourceClass))]
   public string Name { get; set; }

   [Required(ErrorMessageResourceName = "ProductDescriptionRequired", 
             ErrorMessageResourceType = typeof(ResourceClass))]
   public string Description { get; set; }
}

StringLengthAttribute

StringLength 특성은 데이터 필드에 허용되는 문자의 최소 및 최대 길이를 지정합니다. 이 속성은 속성, 공용 필드 및 매개 변수에 적용 할 수 있습니다. 오류 메시지는 속성의 ErrorMessage 등록 정보에 지정해야합니다. MinimumLengthMaximumLength 속성은 각각 최소 및 최대를 지정합니다.

먼저 네임 스페이스를 추가하십시오.

using System.ComponentModel.DataAnnotations;

속성에 특성을 적용합니다.

public class User
{
   // set the maximum
   [StringLength(20, ErrorMessage = "The username cannot exceed 20 characters. ")]
   public string Username { get; set; }

   [StringLength(MinimumLength = 3, MaximumLength = 16, ErrorMessage = "The password must have between 3 and 16 characters.")]        
   public string Password { get; set; }
}

또한 전역 화 된 응용 프로그램의 오류 메시지에 자원을 사용할 수도 있습니다. 이 경우, ErrorMessageResourceName 자원 클래스 (의 리소스 키를 지정해야합니다 resx 온 살고 있고해야 파일) ErrorMessageResourceType :

public class User
{
   [StringLength(20, ErrorMessageResourceName = "StringLength", 
                              ErrorMessageResourceType = typeof(ResoucesKeys))]        
   public string Username { get; set; }

   [StringLength(MinimumLength = 3, 
                        MaximumLength = 16, 
                        ErrorMessageResourceName = "StringLength", 
                        ErrorMessageResourceType = typeof(ResoucesKeys))]        
   public string Password { get; set; }
}

범위 속성

Range 특성은 모든 속성 또는 공용 필드를 꾸밀 수 있으며 숫자 필드가 유효해야한다고 간주되는 범위를 지정합니다.

[Range(minimumValue, maximumValue)]
public int Property { get; set; }

또한 잘못된 데이터를 입력 할 때 사용자가받은 메시지를 설정하는 데 사용할 수있는 선택적 ErrorMessage 속성을 사용할 수 있습니다.

[Range(minimumValue, maximumValue, ErrorMessage = "{your-error-message}")]
public int Property { get; set; }

[Range(1,100, ErrorMessage = "Ranking must be between 1 and 100.")]
public int Ranking { get; set; }

정규 표현식 속성

[RegularExpression] 속성은 모든 속성이나 공용 필드를 꾸밀 수 있으며 속성에 대해 일치해야하는 정규 표현식을 유효하다고 간주하도록 지정합니다.

[RegularExpression(validationExpression)]
public string Property { get; set; }

또한 잘못된 데이터를 입력 할 때 사용자가받은 메시지를 설정하는 데 사용할 수있는 선택적 ErrorMessage 속성을 사용할 수 있습니다.

[RegularExpression(validationExpression, ErrorMessage = "{your-error-message}")]
public string Property { get; set; }

예 (들)

[RegularExpression(@"^[a-z]{8,16}?$", ErrorMessage = "A User Name must consist of 8-16 lowercase letters")]
public string UserName{ get; set; }
[RegularExpression(@"^\d{5}(-\d{4})?$", ErrorMessage = "Please enter a valid ZIP Code (e.g. 12345, 12345-1234)")]
public string ZipCode { get; set; }

특성 비교

Compare 특성은 모델의 두 속성을 Compare 합니다.

오류 메시지는 ErrorMessage 특성을 사용하거나 자원 파일을 사용하여 지정할 수 있습니다.

Compare 속성 include를 using 하려면 다음 네임 스페이스에 usingusing 합니다.

using System.ComponentModel.DataAnnotations;

그런 다음 모델에서 속성을 사용할 수 있습니다.

public class RegisterModel
{
    public string Email { get; set; }

    [Compare("Email",  ErrorMessage = "The Email and Confirm Email fields do not match.")]
    public string ConfirmEmail { get; set; }
}

이 모델의 유효성을 검사 할 때 EmailConfirmEmail 값이 다른 경우 유효성 검사가 실패합니다.

지역화 된 오류 메시지

모든 유효성 검증 속성과 마찬가지로, 자원 파일에서 오류 메시지를 사용할 수도 있습니다. 이 샘플에서는 오류 메시지가 리소스 파일 Resources 에서로드되고 리소스 이름은 CompareValidationMessage .

public class RegisterModel
{
    public string Email { get; set; }

    ["Email", ErrorMessageResourceType = typeof(Resources),  ErrorMessageResourceName = "CompareValidationMessage")]
    public string ConfirmEmail { get; set; }
}

속성 이름의 문자열 사용 안함

속성 값으로 문자열을 사용하지 않으려면 C # 6 이상에서 nameof keyword를 사용할 수 있습니다.

public class RegisterModel
{
    public string Email { get; set; }

    [Compare(nameof(Email),  ErrorMessage = "The Email and Confirm Email fields do not match.")]
    public string ConfirmEmail { get; set; }
}

오류 메시지의 자리 표시 자

오류 메시지에 자리 표시자를 사용할 수 있습니다. 자리 표시 자 {0} 은 현재 속성의 표시 이름으로 바뀌고 {1} 은 관련 속성의 표시 이름으로 바뀝니다.

public class RegisterModel
{
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Display(Name = "Confirm Email")]
    [Compare("Email",  ErrorMessage = "The '{1}' and '{0}' fields do not match.")]
    public string ConfirmEmail { get; set; }
}

모델 검증에 실패하면 오류 메시지가 나타납니다.

'전자 메일'및 '전자 메일 확인'필드가 일치하지 않습니다.

사용자 지정 유효성 검사 특성

필드가 필수이거나 일부 범위의 값을 보장하지만 비즈니스 로직에 고유 한 특정 데이터 유효성 검사가 아닌 몇 가지 규칙의 유효성을 검사 할 때 자체 사용자 정의 검사기를 만들 수 있습니다. 사용자 지정 유효성 검사 특성을 만들려면 ValidationAttribute 클래스를 inherit 하고 IsValid 메서드를 override 해야합니다. IsValid 메서드는 두 개의 매개 변수를 사용합니다. 첫 번째 매개 변수는 value 라는 이름의 object 이고 두 번째 매개 변수는 validationContext 라는 이름의 ValidationContext object 입니다. Value 은 사용자 정의 유효성 검사기가 유효성을 검사 할 필드의 실제 값을 나타냅니다.

Custom Validator 통해 Email 유효성을 검사하려는 경우

public class MyCustomValidator : ValidationAttribute
{
    private static string myEmail= "[email protected]";

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        string Email = value.ToString();
        if(myEmail.Equals(Email))
            return new ValidationResult("Email Already Exist");
        return ValidationResult.Success;
    }
}

public class SampleViewModel
{
    [MyCustomValidator]
    [Required]
    public string Email { get; set; }

    public string Name { get; set; }
}

다음은 DotNetFiddle 데모입니다.

EDMx 모델 - 데이터 주석

Edmx 모델 내부 망

public partial class ItemRequest
{
    public int RequestId { get; set; }
    //...
}

이것에 데이터 주석 추가 -이 모델을 직접 수정하면 모델을 업데이트 할 때 변경 사항이 손실됩니다. 그래서

이 경우 속성을 추가하려면 '필수'

새로운 클래스 만들기 - 이름 선택하기

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

//make sure the namespace is equal to the other partial class ItemRequest
namespace MvcApplication1.Models 
{
    [MetadataType(typeof(ItemRequestMetaData))]
    public partial class ItemRequest
    {
    }

    public class ItemRequestMetaData
    {
        [Required]
        public int RequestId {get;set;}

        //...
    }
}

또는

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace YourApplication.Models
{
    public interface IEntityMetadata
    {
        [Required]
        Int32 Id { get; set; }
    }

    [MetadataType(typeof(IEntityMetadata))]
    public partial class Entity : IEntityMetadata
    {
        /* Id property has already existed in the mapped class */
    }
}

데이터베이스의 첫 번째 구현을위한 데이터 주석 (모델 코드 자동 생성)

[MetadataType(typeof(RoleMetaData))]
public partial class ROLE
{
}

public class RoleMetaData
{
    [Display(Name = "Role")]
    public string ROLE_DESCRIPTION { get; set; }

    [Display(Name = "Username")]
    public string ROLE_USERNAME { get; set; }
}

데이터베이스를 먼저 사용하고 모델 코드가 자동 생성 된 경우이 메시지는 모델 코드 위에 나타납니다.

이 코드는 템플릿에서 생성되었습니다. 이 파일을 수동으로 변경하면 응용 프로그램에서 예기치 않은 동작이 발생할 수 있습니다. 코드가 재생성되면이 파일의 수동 변경 사항을 덮어 씁니다.

데이터 주석을 사용하기를 원하고 edmx를 새로 고친다면 그것들을 덮어 쓰지 않기를 바랄 뿐이다. 위의 예제처럼 보이는 부분 클래스를 모델 폴더에 추가하면된다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow