我目前正在研究用VB.NET编写的Winforms应用程序并实现实体框架(4.4)。我想向我的实体添加验证属性,以便我可以在UI上验证它们 - 就像我在MVC中一样。
我创建了包含IsValid方法的'Buddy Class',并指向包含数据注释的'MetaData'类。 Imports System.ComponentModel.DataAnnotations 导入System.Runtime.Serialization Imports 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个字符)的实例上调用IsValid但没有ShortDescription,即使该属性上有必需的注释,验证也会通过。
我在这里做错了什么?
答案 0 :(得分:2)
尝试TryValidateObject()
的其他方法签名,并明确将validateAllProperties
设置为true:
Dim validation = Validator.TryValidateObject(
Me, context, _validationResults, true)