문자열 유형의 4 가지 속성이있는 모델이 있습니다. StringLength 주석을 사용하여 단일 속성의 길이를 확인할 수 있다는 것을 알고 있습니다. 그러나 결합 된 4 개 속성의 길이를 확인하고 싶습니다.
데이터 주석으로이를 수행하는 MVC 방법은 무엇입니까?
나는 MVC를 처음 사용하고 내 자신의 솔루션을 만들기 전에 올바른 방법으로하고 싶기 때문에 이것을 묻습니다.
문자열 유형의 4 가지 속성이있는 모델이 있습니다. StringLength 주석을 사용하여 단일 속성의 길이를 확인할 수 있다는 것을 알고 있습니다. 그러나 결합 된 4 개 속성의 길이를 확인하고 싶습니다.
데이터 주석으로이를 수행하는 MVC 방법은 무엇입니까?
나는 MVC를 처음 사용하고 내 자신의 솔루션을 만들기 전에 올바른 방법으로하고 싶기 때문에 이것을 묻습니다.
답변:
사용자 지정 유효성 검사 속성을 작성할 수 있습니다.
public class CombinedMinLengthAttribute: ValidationAttribute
{
public CombinedMinLengthAttribute(int minLength, params string[] propertyNames)
{
this.PropertyNames = propertyNames;
this.MinLength = minLength;
}
public string[] PropertyNames { get; private set; }
public int MinLength { get; private set; }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var properties = this.PropertyNames.Select(validationContext.ObjectType.GetProperty);
var values = properties.Select(p => p.GetValue(validationContext.ObjectInstance, null)).OfType<string>();
var totalLength = values.Sum(x => x.Length) + Convert.ToString(value).Length;
if (totalLength < this.MinLength)
{
return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
}
return null;
}
}
그런 다음 뷰 모델을 사용하여 속성 중 하나를 장식 할 수 있습니다.
public class MyViewModel
{
[CombinedMinLength(20, "Bar", "Baz", ErrorMessage = "The combined minimum length of the Foo, Bar and Baz properties should be longer than 20")]
public string Foo { get; set; }
public string Bar { get; set; }
public string Baz { get; set; }
}
this.RuleFor(x => x.Foo).Must((x, foo) => x.Foo.Length + x.Bar.Length + x.Baz.Length < 20).WithMessage("The combined minimum length of the Foo, Bar and Baz properties should be longer than 20");
. 이제 데이터 주석으로 작성 해야하는 내 대답의 코드를보고 어떤 것을 선호하는지 알려주십시오. 선언적 유효성 검사 모델은 명령형 모델에 비해 매우 열악합니다.
IsValid
호출되는이 validationContext
null입니다. 내가 뭘 잘못했는지 알아? :-(
모델은 인터페이스를 구현해야합니다 IValidatableObject
. Validate
메서드에 유효성 검사 코드를 넣으십시오 .
public class MyModel : IValidatableObject
{
public string Title { get; set; }
public string Description { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Title == null)
yield return new ValidationResult("*", new [] { nameof(Title) });
if (Description == null)
yield return new ValidationResult("*", new [] { nameof(Description) });
}
}
참고 : 이것은 서버 측 유효성 검사입니다. 클라이언트 측에서는 작동하지 않습니다. 양식 제출 후에 만 유효성 검사가 수행됩니다.
ExpressiveAnnotations 는 다음과 같은 가능성을 제공합니다.
[Required]
[AssertThat("Length(FieldA) + Length(FieldB) + Length(FieldC) + Length(FieldD) > 50")]
public string FieldA { get; set; }
Darin의 대답을 개선하기 위해 조금 더 짧을 수 있습니다.
public class UniqueFileName : ValidationAttribute
{
private readonly NewsService _newsService = new NewsService();
public override bool IsValid(object value)
{
if (value == null) { return false; }
var file = (HttpPostedFile) value;
return _newsService.IsFileNameUnique(file.FileName);
}
}
모델:
[UniqueFileName(ErrorMessage = "This file name is not unique.")]
오류 메시지가 필요합니다. 그렇지 않으면 오류가 비어 있습니다.
배경:
수신 된 데이터가 유효하고 올바른지 확인하여이 데이터로 추가 처리를 수행 할 수 있도록 모델 유효성 검사가 필요합니다. 액션 메서드에서 모델을 검증 할 수 있습니다. 기본 제공 유효성 검사 속성은 Compare, Range, RegularExpression, Required, StringLength입니다. 그러나 기본 제공 속성 이외의 유효성 검사 속성이 필요한 시나리오가있을 수 있습니다.
사용자 지정 유효성 검사 속성
public class EmployeeModel
{
[Required]
[UniqueEmailAddress]
public string EmailAddress {get;set;}
public string FirstName {get;set;}
public string LastName {get;set;}
public int OrganizationId {get;set;}
}
사용자 지정 유효성 검사 특성을 만들려면 ValidationAttribute에서이 클래스를 파생해야합니다.
public class UniqueEmailAddress : ValidationAttribute
{
private IEmployeeRepository _employeeRepository;
[Inject]
public IEmployeeRepository EmployeeRepository
{
get { return _employeeRepository; }
set
{
_employeeRepository = value;
}
}
protected override ValidationResult IsValid(object value,
ValidationContext validationContext)
{
var model = (EmployeeModel)validationContext.ObjectInstance;
if(model.Field1 == null){
return new ValidationResult("Field1 is null");
}
if(model.Field2 == null){
return new ValidationResult("Field2 is null");
}
if(model.Field3 == null){
return new ValidationResult("Field3 is null");
}
return ValidationResult.Success;
}
}
도움이 되었기를 바랍니다. 건배!
참고 문헌
대답하기 조금 늦었지만 누가 찾고 있는지. 데이터 주석과 함께 추가 속성을 사용하여 쉽게 수행 할 수 있습니다.
public string foo { get; set; }
public string bar { get; set; }
[MinLength(20, ErrorMessage = "too short")]
public string foobar
{
get
{
return foo + bar;
}
}
그게 전부입니다. 특정 위치에 유효성 검사 오류도 표시하려면보기에 다음을 추가 할 수 있습니다.
@Html.ValidationMessage("foobar", "your combined text is too short")
뷰에서이 작업을 수행하면 현지화를 수행하려는 경우 유용 할 수 있습니다.
도움이 되었기를 바랍니다!