2014-11-06 2 views
0

У меня есть код, подобный следующему:требующие наследуемые свойства, используя DataAnnotations

Imports System.ComponentModel.DataAnnotations 
Class Person 
    Dim _ssn As String = "" 
    Public Overridable Property SSN(format As Boolean) As String 
    Get 
     If format Then 
      ' Return formatted SSN 
     Else : Return _ssn 
     End If 
    End Get 
    Set(value As String) 
     _ssn = value 
    End Set 
    End Property 
End Class 

Class Employee 
    Inherits Person 

    <Required()> 
    Public Overrides Property SSN(format As Boolean) As String 
    Get 
     Return MyBase.SSN(format) 
    End Get 
    Set(value As String) 
     MyBase.SSN(format) = value 
    End Set 
End Property 
End Class 

Когда я использую Validator.ValidateObject() класса Employee, он проверяет только штраф, даже если свойство ПЛА нечего.

Любые идеи, почему требуемый атрибут не работает?

Благодаря

+0

'дим е = Новый сотрудник()' 'Validator.ValidateObject (е, New ValidationContext (е))' 'результаты в ValidationException: Поле SocialSecurityNumber является required.' для меня. – Mark

+0

Хм, это странно. Я только что создал новый проект с моим примером, и он работает для меня тоже. Я собираюсь исследовать немного больше, чтобы увидеть, что в моем фактическом проекте заставляет это не работать. – pvdjay

+0

Хорошо, я обнаружил, что не хватает, что вызывает описанное поведение. Свойство номера социального обеспечения на самом деле является параметризованным свойством. Я обновлю его в вопросе. – pvdjay

ответ

0

Я подозреваю, что проверка не будет работать на индексированной/параметризированную собственности, так как я не вижу, как валидатор может решить, что передать для параметра format. В качестве обходного пути вы можете создать неиндексированное свойство, чтобы включить атрибут Required.

Class Employee 
    Inherits Person 

    <Required()> 
    Public Overloads Property SSN As String 
     Get 
      Return Me.SSN(False) 
     End Get 
     Set(value As String) 
      Me.SSN(False) = value 
     End Set 
    End Property 

    Public Overrides Property SSN(format As Boolean) As String 
     Get 
      Return MyBase.SSN(format) 
     End Get 
     Set(value As String) 
      MyBase.SSN(format) = value 
     End Set 
    End Property 

End Class 

Честно говоря, я бы, вероятно, изменить дизайн, чтобы иметь два свойства - (! Но, возможно, это только мне) чтения/записи SSN собственности, и только для чтения FormattedSSN свойство, которое кажется чище мне ,

+0

Великие умы, кажется, похожи. Мы просто разместили одно и то же решение. :) – pvdjay

+0

Ха, мы должны печатать с одинаковой скоростью, чтобы отправить в течение 30 секунд друг от друга! :-) – Mark

0

Похоже, что параметризованные свойства не будут обладать требуемым атрибутом. В качестве обходного пути я использовал перегрузки для решения этой проблемы.

Imports System.ComponentModel.DataAnnotations 

Class Person 

    Dim _ssn As String 
    Public Property SSN() As String 
     Get 
      Return _ssn 
     End Get 
     Set(ByVal value As String) 
      _ssn = JustNumbers(value) 
     End Set 
    End Property 

    Public Property SSN(format As String) As String 
     Get 
      Try 
       Return CInt(Me.SSN).ToString(format) 
      Catch ex As InvalidCastException : Return Me.SSN 
      End Try 
     End Get 
     Set(value As String) 
      SSN = value 
     End Set 
    End Property 

    Function IsValid() As Boolean 
     Return Validator.TryValidateObject(Me, New ValidationContext(Me), Nothing) 
    End Function 
End Class 

Class Employee 
    Inherits Person 

    <Required()> 
    Public Overloads Property SSN() As String 
     Get 
      Return MyBase.SSN 
     End Get 
     Set(value As String) 
      MyBase.SSN = value 
     End Set 
    End Property 
End Class 
Смежные вопросы