私は現在、VB.NET で記述され、Entity Framework (4.4) を実装する Winforms アプリケーションに取り組んでいます。MVC と同じように、エンティティに検証属性を追加して、UI で検証できるようにしたいと考えています。
IsValid メソッドを含み、データ注釈を含む「MetaData」クラスを指す「Buddy クラス」を作成しました。インポート 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 または何もない) ProductName を持つインスタンスで IsValid メソッドを呼び出すと、検証が失敗し、ValidationResults コレクションに正しいエラー メッセージが入力されます。ここまでは順調ですね.....
ただし、50 文字を超える ProductName を持つインスタンスで IsValid を呼び出すと、MaxLength 属性に関係なく検証に合格します!
また、有効な ProductName (空ではなく、50 文字以下) を持つインスタンスで IsValid を呼び出すが、ShortDescription がない場合、そのプロパティに Required アノテーションがあっても、検証はパスします。
ここで何が間違っていますか?