CustomValidationAttribute не работает, когда другие атрибуты применяются к классу - PullRequest
0 голосов
/ 23 февраля 2011

Размножение:

Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations
Module Module1

  Sub Main()
    Dim type = GetType(Contact)
    TypeDescriptor.AddProviderTransparent(
      New AssociatedMetadataTypeTypeDescriptionProvider(type), type)


    Dim contact As New Contact
    Dim context As New ValidationContext(contact, Nothing, Nothing)
    Dim errors As New List(Of ValidationResult)
    Dim result = Validator.TryValidateObject(contact, context, errors, True)
  End Sub
End Module

<CustomValidation(GetType(Contact.ContactMd), "*********************")>
<MetadataType(GetType(Contact.ContactMd))>
Public Class Contact

  Public Property Email As String
  Public Property EmailRepeat As String

  Public Class ContactMd

    '<Required()>
    Public Property Email
    '<Required()>
    Public Property EmailRepeat

    Public Shared Function ValidateEmails(ByVal contact As Contact) _
        As ValidationResult
      Return If(contact.Email = contact.EmailRepeat,
                ValidationResult.Success,
                New ValidationResult("Fail!"))
    End Function
  End Class
End Class

Приведенный выше код вызовет исключение:
The CustomValidationAttribute method '*********************' does not exist in type 'ContactMd' or is not public and static.

Это исключение оправдано и является признаком того, что все работает. Как только я раскомментирую атрибуты Required в свойствах класса Md, исключение не будет выброшено, что означает, что система проверки не проверяет как атрибуты с типом свойства, так и атрибуты уровня класса.

Есть обходной путь?

Ответы [ 2 ]

0 голосов
/ 18 мая 2011

Подпись для метода, указанного атрибутом CustomValidationAttribute, должна быть:

VB:

Public Shared Function OnValidate(
    entity As Contact, context As ValidationContext) As ValidationResult

C #:

public static ValidationResult OnValidate(Contact entity, ValidationContext context)

Если проверка в порядке,должен вернуть ValidationResult.Success.

0 голосов
/ 06 апреля 2011

Ответ заключается в том, что система проверки сначала проверяет атрибуты проверки свойств (атрибуты Required в этом случае) и будет переходить к CustomValidationAttribute, только если объект передал атрибуты свойств.

Итак, согласно приведенному выше воспроизведению, изменив строку

Dim contact As New Contact

к чему-то вроде (позволяя объекту пройти валидацию свойства):

Dim contact As New Contact With { .Email = "*", .EmailRepeat = "*" }

Сгенерирует ожидаемое исключение.

...