Как я могу сделать пользовательский действительный атрибут "RequiredIf" в vb.net
Я пытаюсь создать customValidAttribute в VB.NET
Namespace EventRules
Public Class CustomRuleAttribute
Inherits ValidationAttribute
Protected Overrides Function IsValid(value As Object, validationContext as validationContext) As ValidationResult
If EventIsInOneWeek = True Then
'Property is required
End If
Return New ValidationResult(Me.FormatErrorMessage(validationContext.DisplayName))
End Function
И в моем интерфейсе
Imports System.ComponentModel.DataAnnotations
Imports EventRules
Namespace Contracts
Public Interface IEvent
Property EventIsInOneWeek As Boolean
<CustomRule()>
Property AdditionalProperty
Итак, ошибка, которую я получаю, находится на EventIsInOneWeek и говорит: "Ссылка на элемент без общего доступа требует ссылки на объект"
Редактировать: передаваемый объект отличается от 'EventIsInOneWeek', и я хочу, чтобы он был обязательным, только если EventIsInOneWeek имеет значение true.
Изменить: Также обновил код более полно
1 ответ
Как упоминалось выше - простое решение, которое я искал, заключалось в передаче всего бизнес-объекта с validationContext
, Тем не менее, это выявляет некоторые недостатки безопасности в моей системе, поэтому я создал этот обходной путь.
В моей базовой бизнес-логике:
Public Overridable Function CheckRules() As Boolean
Me.Errors = New List(Of ValidationRules)()
Return Me.Validate(Me.Errors)
End Function
...
Public Overridable Function Validate(validationContext As ValidationContext) As IEnumerable(Of Validation Result) Implements IValidateObject.Validate
Return Nothing
End Function
И в моей бизнес-логике для самого объекта
Protected Overrides Function Validate(validationContext As ValidationContext) As IEnumerable(Of Validation Result)
Dim results = New List(Of ValidationResult)()
'valiation conditionals here
Return results
End Function
Я передаю свою базовую логику в свой бизнес-объект, и она, кажется, работает хорошо, к сожалению, она не генерирует автоматическую проверку интерфейса CustomValidationAttributes
делать.
Это также позволяет мне validationRules немного повторного использования, которое не будет предоставлено при передаче validationContext в.