CustomValidationAttribute不';当其他属性应用于该类时,它将不起作用

CustomValidationAttribute不';当其他属性应用于该类时,它将不起作用,validation,.net-4.0,data-annotations,validationattribute,Validation,.net 4.0,Data Annotations,Validationattribute,复制: Imports System.ComponentModel Imports System.ComponentModel.DataAnnotations Module Module1 Sub Main() Dim type = GetType(Contact) TypeDescriptor.AddProviderTransparent( New AssociatedMetadataTypeTypeDescriptionProvider(type), typ

复制:

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
导入System.ComponentModel
导入System.ComponentModel.DataAnnotations
模块1
副标题()
Dim type=GetType(联系人)
TypeDescriptor.AddProviderTransparent(
新关联的MetadataTypeDescriptionProvider(类型),类型)
暗触点作为新触点
将上下文设置为新的ValidationContext(联系人,无,无)
Dim错误作为新列表(ValidationResult)
Dim结果=Validator.TryValidateObject(联系人、上下文、错误、True)
端接头
端模块
公共类联系人
公共属性电子邮件作为字符串
公共属性作为字符串重复
公共类联系人
'
公共财产电子邮件
'
公共财产
公共共享功能ValidateEmails(ByVal联系人作为联系人)_
作为验证结果
如果(contact.Email=contact.Email)重复,则返回,
验证结果。成功,
新的ValidationResult(“失败!”)
端函数
末级
末级
上述代码将引发异常:
CustomValidationAttribute方法“************************”在类型“ContactMd”中不存在,或者不是公共和静态的。

这一例外是合理的,它是一切正常的标志。 一旦我取消注释Md类中属性上的
Required
属性,将不会抛出异常,这意味着验证系统不会同时验证属性类型属性和类级别属性


任何解决方法?

答案是,验证系统首先验证属性验证属性(在本例中为
所需的
属性),并且仅当对象通过属性属性时才会进入
CustomValidationAttribute

所以根据上面的复制,改变线条

Dim contact As New Contact
例如(允许eninity通过属性验证):


将引发预期的异常。

CustomValidationAttribute指定的方法的签名必须是:

VB:

C#:


如果验证正常,它应该返回ValidationResult.Success。

我没有测试它,但我不确定它一定在这个签名中。抛出异常的原因是它的名称错误,否则就我记忆所及,它可以正常工作。
Dim contact As New Contact With { .Email = "*", .EmailRepeat = "*" }
Public Shared Function OnValidate(
    entity As Contact, context As ValidationContext) As ValidationResult
public static ValidationResult OnValidate(Contact entity, ValidationContext context)