0

再生:

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.

この例外は正当化されており、物事が機能していることを示しています。Md クラスのプロパティの属性のコメントを外すRequiredと、例外はスローされなくなります。つまり、検証システムは、プロパティ タイプの属性とクラス レベルの属性の両方を検証しません。

回避策はありますか?

4

2 に答える 2

0

答えは、検証システムは最初にプロパティ検証属性 (この場合は属性) を検証し、オブジェクトがプロパティ属性を渡した場合Requiredにのみに進むということです。CustomValidationAttribute

したがって、上記の複製に従って、行を変更します

Dim contact As New Contact

次のようなものにします(エンティティがプロパティの検証に合格できるようにします):

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

予想される例外をスローします。

于 2011-04-06T07:44:45.160 に答える