【问题标题】:How can I make a "RequiredIf" custom valid attribute in vb.net如何在 vb.net 中创建“RequiredIf”自定义有效属性
【发布时间】:2015-04-01 19:36:59
【问题描述】:

我正在尝试在 VB.NET 中创建 customValidAttribute

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 为真时才需要它。

编辑:还更完整地更新了代码

【问题讨论】:

  • EventIsInOneWeek 在哪里?另一个班级?另一个对象?您必须引用具有 EventIsInOneWeek 属性的对象。
  • EventIsInOneWeek 与我的其他属性在同一个对象中。我可以在这里扩展我的代码,给我一秒钟
  • 我对验证属性不太熟悉。但是,我想您必须将value 转换为IEvent 并访问此对象的EventIsInOneWeek
  • @Nico 当我这样做时——我失去了对需要验证的特定对象的引用,而只是在这里传入一个模型。这是因为在 System.ComponentModel.DataAnnotations 中,函数 IsValid 可以用(object)(object, validationContext) 覆盖,并且对象必须是紧跟&lt;CustomValidationAttribute&gt; 之后的行上的特定属性至少我认为这是准确的
  • 好的,我明白了。 validationContextObjectInstance 是否为您提供所需的对象?

标签: vb.net customvalidator


【解决方案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 时是无法提供的。

【讨论】:

    猜你喜欢
    • 2011-06-20
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多