0

私は現在、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 アノテーションがあっても、検証はパスします。

ここで何が間違っていますか?

4

1 に答える 1

2

他のメソッド シグネチャを試してTryValidateObject()、明示的validateAllPropertiesに trueに設定します。

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