关于vb.net:Only首先应用DataAnnotation验证

Only first DataAnnotation validation being applied

我目前正在开发一个用vb.net编写的winforms应用程序,并实现实体框架(4.4)。我想向我的实体添加验证属性,这样我就可以在UI上验证它们——就像在MVC中一样。

我已经创建了"buddy class",它包含一个isvalid方法,并指向一个包含数据注释的"metadata"类。导入system.componentModel.dataAnnotations导入system.runtime.serialization导入System.ComponentModel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<MetadataTypeAttribute(GetType(ProductMetadata))>
Public Class Product

    Private _validationResults As New List(Of ValidationResult)
    Public ReadOnly Property ValidationResults() As List(Of ValidationResult)
        Get
        Return _validationResults
    End Get
End Property

Public Function IsValid() As Boolean

    TypeDescriptor.AddProviderTransparent(New AssociatedMetadataTypeTypeDescriptionProvider(GetType(Product), GetType(ProductMetadata)), GetType(Product))

    Dim result As Boolean = True

    Dim context = New ValidationContext(Me, Nothing, Nothing)

    Dim validation = Validator.TryValidateObject(Me, context, _validationResults)

    If Not validation Then
        result = False
    End If

    Return result

End Function

End Class

Friend NotInheritable Class ProductMetadata

    <Required(ErrorMessage:="Product Name is Required", AllowEmptyStrings:=False)>
    <MaxLength(50, ErrorMessage:="Too Long")>
    Public Property ProductName() As Global.System.String

    <Required(ErrorMessage:="Description is Required")>
    <MinLength(20, ErrorMessage:="Description must be at least 20 characters")>
    <MaxLength(60, ErrorMessage:="Description must not exceed 60 characters")>
    Public Property ShortDescription As Global.System.String

    <Required(ErrorMessage:="Notes are Required")>
    <MinLength(20, ErrorMessage:="Notes must be at least 20 characters")>
    <MaxLength(1000, ErrorMessage:="Notes must not exceed 1000 characters")>
    Public Property Notes As Global.System.String

End Class

isvalid方法中的第一行注册了元数据类(我唯一能找到实际工作的方法——否则不接受任何注释!).I然后使用System.ComponentModel.Validator.TryValidateObject方法执行验证。

当我对具有空(空/空)产品名称的实例调用IsValid方法时,验证失败,并且ValidationResults集合中填充了正确的错误消息。到现在为止,一直都还不错。。。。。

但是,如果我对产品名称超过50个字符的实例调用isvalid,那么尽管maxlength属性是有效的,但验证还是通过的!

此外,如果我对具有有效产品名称(不为空且不超过50个字符)但没有简短描述的实例调用IsValid,则即使该属性上有必需的批注,验证也会通过。

我在这里做错什么了?


尝试对TryValidateObject()使用其他方法签名,并将validateAllProperties显式设置为true:

1
2
Dim validation = Validator.TryValidateObject(
        Me, context, _validationResults, true)