プロジェクトへの参照を追加しましたMVC Foolproof Validation
。モデルで注釈の 1 つを使用しています。
<Required(ErrorMessage:="Start Date is required.")>
<LessThanOrEqualTo("EndDate", ErrorMessage:="Start Date must not be after End Date.")>
Public Property StartDate As DateTime
Get
Return Item.StartDate
End Get
Set(value As DateTime)
Item.StartDate = value
End Set
End Property
<Required(ErrorMessage:="End Date is required.")>
Public Property EndDate As DateTime
Get
Return Item.EndDate
End Get
Set(value As DateTime)
Item.EndDate = value
End Set
End Property
次のように検証する検証クラスがあります。
Dim results As New List(Of ValidationResult)()
Debug.Assert(model IsNot Nothing)
Dim modelProperties = New List(Of PropertyInfo)
GetModelPropertiesRecursively(model.GetType(), modelProperties)
For Each pi As PropertyInfo In modelProperties
Dim result = Validator.TryValidateProperty(pi.GetValue(model),
New ComponentModel.DataAnnotations.ValidationContext(model, Nothing, Nothing) With {.MemberName = pi.Name}, results)
Next
Dim modelName = model.GetType().Name
Dim mapped = results.Select(Function(result)
Debug.Assert(result.MemberNames.Any())
Return New ValidationError(modelName, result.MemberNames.First(), result.ErrorMessage)
End Function)
For Each validationError As ValidationError In mapped
context.ValidationErrors.Add(validationError)
Next
これはすべての通常DataAnnotation
の s で機能しますが、新しい注釈ではキャッチされません。にデバッグできませんValidator.TryValidateProperty
が、 の後であるにもかかわらず、結果はプロパティに対して true として返されますEndDate
。
検証ロジックに欠陥はありますか?