2012-10-08 4 views
5

다른 클래스 모델이 상속하는 기본 접촉 모델을 사용하고 있습니다.모델의 유효성 검사 속성 상속 금지

public class BaseContactModel 
{ 
    [Required(ErrorMessage = "Firstname is required")] 
    public virtual string FirstName { get; set; } 
} 

기본 연락처 모델은 유효성 검사 속성이 필요한 플래그하지만 무시하거나 중지 할 경우 속성을 사용합니다. 이게 가능한가?

public class ContactModel : BaseContactModel 
{ 
    [NotRequired] 
    public override string FirstName { get; set; } 
} 

나는 그냥 true를 반환하는을 NotRequired 새로운 검증 속성을 사용하려고하지만, 속성이 바로 실행되도록 필요한 & NotRequired을 쌓아되는 표시 및 유효성 검사가 실패합니다.

좀 관련이없는 속성은 '상속'속성을 가지고 있음을 발견 (내가 찾을 수있는) 솔루션을 찾고에

,하지만 난 네이티브 검증이 표시되지는 System.ComponentModel.DataAnnotations 속성.

이 오류가 발생 했습니까? 상속을 사용할 수 없게하는 자체 버전을 롤백해야합니까? 어떤 도움이라도 대단히 감사합니다.

답변

2

를 원하는 경우가 될 수는 각 인스턴스 중 하나를 검증 . 내가 볼 수 있듯이, 둘 다 기본 속성을 사용합니다.

유효성 검사 루틴을 명확하게하기 위해 컨트롤 클래스 ControlModel을 추가했습니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     ValidationTest<Model>(); 
     ValidationTest<BaseModel>(); 
     ValidationTest<ControlModel>(); 

     Console.Read(); 
    } 

    private static void WriteAttributeInfo<T>() 
    { 
     Console.WriteLine(string.Concat(typeof(T), " attributes:")); 
     typeof(T).GetProperties().SelectMany(m => m.GetCustomAttributes(true)).Select(a => { Console.WriteLine(a); return a; }).ToList(); 
    } 

    private static void ValidationTest<T>() 
    { 
     object obj = Activator.CreateInstance<T>(); 
     Console.WriteLine(string.Concat(typeof(T), " test: isValid = ", Validator.TryValidateObject(obj, new ValidationContext(obj, serviceProvider: null, items: null), new List<ValidationResult>()))); 
    } 
} 

class ControlModel 
{ 
    public string FirstName { get; set; } 

    public string Email { get; set; } 
} 

class BaseModel 
{ 
    [RequiredAttribute] 
    public virtual string FirstName { get; set; } 

    [RequiredAttribute] 
    public virtual string Email { get; set; } 
} 

class Model : BaseModel 
{ 
    public new string FirstName { get; set; } 

    public new string Email { get; set; } 
} 

ConsoleApplication1.Model 시험 : isValid = 거짓

ConsoleApplication1.BaseModel 시험 : isValid = 거짓

ConsoleApplication1.ControlModel 시험 : isValid = 진정한

에서 이 예제에서는 상속 된 필수 validatio를 재정의/숨기기/무시할 수없는 것으로 보입니다. n (아직 시도하지 않은 다른 사람) 속성.

+0

내 질문에 답하고 수락하는 것이 싫지만 위의 테스트에서 원래 질문에서와 같이 생각할 수 있습니다. –

+0

정말이 문제를 해결할 수 있습니까? – Giorgio

0

이 다른 BaseModel에서 상속 Model이 새로운 키워드를 사용하는이 아래에, 내가 만든 하나 개의 클래스를 참조하십시오 당신이 실제로 새 속성

public class ContactModel : BaseContactModel 
{ 
     [NotRequired] 
     public new string FirstName { get; set; } 
} 
+1

이것은 속성을 대체합니까? 나는 (가상 속성과 함께) 새로운 것을 사용하려고 시도했지만 여전히 유효성 검사를 수행하는 것으로 보인다. –

+0

저는이 전략을 과거 몇 번 사용했습니다. 새로운 속성이어야하므로 하나의 유효성 검사 속성 또는 다른 속성 만 실행해야합니다. 물론 실제로 사용되는 속성을 결정하기 위해 모델 변수를 선언하거나 사용하는 방법에 따라 다릅니다. 작동하지 않는 경우 컨트롤러 코드를 게시하여 이유를 파악할 수 있습니다. – dumdum

+0

답장을 보내 주셔서 감사 드리며, 오늘 저녁에 또 다른 노력을 기울일 것이며 상자에서 곧바로 사이트를 시도해 볼 수도 있습니다. –