asp.net-mvc
데이터 주석
수색…
소개
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);
}
RemoteAttribute
의 AdditionalFields
속성을 사용하여 모델의 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
등록 정보에 지정해야합니다. MinimumLength
및 MaximumLength
속성은 각각 최소 및 최대를 지정합니다.
먼저 네임 스페이스를 추가하십시오.
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
하려면 다음 네임 스페이스에 using
을 using
합니다.
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; }
}
이 모델의 유효성을 검사 할 때 Email
및 ConfirmEmail
값이 다른 경우 유효성 검사가 실패합니다.
지역화 된 오류 메시지
모든 유효성 검증 속성과 마찬가지로, 자원 파일에서 오류 메시지를 사용할 수도 있습니다. 이 샘플에서는 오류 메시지가 리소스 파일 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를 새로 고친다면 그것들을 덮어 쓰지 않기를 바랄 뿐이다. 위의 예제처럼 보이는 부분 클래스를 모델 폴더에 추가하면된다.