Как я могу сделать пользовательский действительный атрибут "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 в.

Другие вопросы по тегам