我在项目中添加了对MVC Foolproof Validation
的引用。我在我的模型上使用其中一个注释:
<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
,但它没有捕获新注释。我无法调试到Validator.TryValidateProperty
,但结果对于该属性来说是真实的,尽管它位于EndDate
之后。
验证逻辑是否存在缺陷?