0

우리 데이터베이스에는 참조 무결성 (예 : emailTypes, phoneTypes, countryCodes, stateCodes)을 위해 사용하는 여러 개의 코드 테이블이 있습니다. 우리의 응용 프로그램에서는 이러한 테이블을 일반 목록에로드하고 캐시합니다. 현재 응용 프로그램에는 제출 된 값이 하드 코딩 된 값 목록에 있는지 확인하기 위해 각 목록에 대한 사용자 지정 ValidationAttributes가 있습니다. 필자는 일반 목록, 값을 검색 할 속성 및 값의 데이터 유형을 취하는 새로운 사용자 정의 validationAttribute로이 값을 다시 작성할 수 있으며 값이 목록에 존재하면 유효한 값을 반환한다고 생각합니다.값을 확인하는 ValidationAttribute 일반 목록

먼저 사용자 정의 유효성 검사에서 런타임에 채워지는 컴파일 시간 목록을 사용할 수 있는지 궁금합니다.

그렇다면 누구나 이미이 좋은 해결책을 생각해 냈습니까? 그렇지 않다면 좋은 일이 있습니까?

js 유효성 확인을 위해 IClientValidatable를 포함하면 보너스 포인트가 포함됩니다 (stackoverflow에는 보너스 포인트가 포함되지 않습니다).

답변

0

당신은 그냥 일반 유효성 검사 속성에 유효성 검사 논리를 넣어

public abstract class GenericValidationAttribute:ValidationAttribute 
{ 
    protected GenericValidationAttribute(DataValidationType dataValidationType) 
    { 
     ValidationType = dataValidationType; 
    } 

    protected DataValidationType ValidationType { get; set; } 

    public override bool IsValid(object value) 
    { 
     switch (ValidationType) 
     { 
      case DataValidationType.Email: 
       //Check if the value is in the built-in emails 
       break; 
      case DataValidationType.Phone: 
       //Check if the value is in the phone list 
       break; 
     } 

     return base.IsValid(value); 
    } 
} 

public class EmailValidationAttribute : GenericValidationAttribute 
{ 
    public EmailValidationAttribute() : base(DataValidationType.Email) 
    {} 

} 


public enum DataValidationType 
{ 
    Email, 
    Phone, 
    Country, 
    State 
} 

중앙 유효성 검사 논리를 구현하기 위해 다음 코드를 사용하고, 다른 특정 검증 클래스 그것으로부터 상속을 가질 수 있습니다.

건배.

+0

이 솔루션은 하나의 위치에 유효성 검사를 지역화하지만 유효성 검사 클라이언트가 검색 속성 및 검색 데이터 유형과 함께 목록에 전달되는 한 내 질문에는 대답하지 않습니다. 나는 이런 식으로 받아들이는 솔루션을 찾고 있으므로 각 목록의 유효성 검사를 계속 기록 할 필요가 없습니다. [GenericListValidation (ListToVerify, PropertyToSearch, DataType)] 아마도이 작업을 수행 할 수도 없습니다. – user1041169

0

나는 몇 가지 가정을했다.

  1. 컬렉션은 정적 클래스의 정적 사용자 정의가 필요
  2. 컬렉션이 IList의

먼저 상속 속성 검증 핸들러 호출 IsValid 때

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)] 
public class ListCheckAttribute : ValidationAttribute 
{ 
    // The name of the class that holds the collection 
    public Type ContainerType { get; private set; } 
    // The name of the property holding the list 
    public string PropertyName { get; private set; } 

    public ListCheckAttribute(Type ContainerType, String PropertyName) 
    { 
     this.ContainerType = ContainerType; 
     this.PropertyName = PropertyName; 
    } 

    public override bool IsValid(object value) 
    { 
     var property = ContainerType.GetProperty(this.PropertyName); 
     var val = property.GetMethod.Invoke(null, null); 
     var list = (IList)val; 
     return list.Contains(value); 
    } 
} 

public class MyClass 
{ 
    [ListCheck(typeof(CollectionClass), "Collection")] 
    public int NumberToValidate { get; set; } 

    public MyClass() 
    { 
     NumberToValidate = 4; 
    } 
} 

지금이 도착 속성입니다 목록에서 속성을 및 포함 할 수 있도록 IList 위해 캐스팅합니다. 클래스의 경우 IEquatable를 구현하고 Equals 메서드를 구현하면됩니다.