0

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

我创建了我的“好友类”,其中包含一个 IsValid 方法并指向一个包含数据注释的“元数据”类。导入 System.ComponentModel.DataAnnotations 导入 System.Runtime.Serialization 导入 System.ComponentModel

<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 方法中的第一行注册了 MetaData 类(只有这样我才能找到实际工作的方法 - 否则没有注释被尊重!)。然后我使用 System.ComponentModel.Validator.TryValidateObject 方法来执行验证。

当我在具有空(null/nothing)ProductName 的实例上调用 IsValid 方法时,验证失败,并且 ValidationResults 集合填充了正确的错误消息。到现在为止还挺好.....

但是,如果我在具有超过 50 个字符的 ProductName 的实例上调用 IsValid,则验证通过,尽管 MaxLength 属性!

此外,如果我在具有有效 ProductName(不为空且不超过 50 个字符)但没有 ShortDescription 的实例上调用 IsValid,则即使该属性上有必需的注释,验证也会通过。

我在这里做错了什么?

4

1 回答 1

2

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

Dim validation = Validator.TryValidateObject(
        Me, context, _validationResults, true)
于 2013-05-31T10:02:04.527 回答