Enterprise Library 4.0 ValidationProvider自我验证问题

时间:2011-04-19 19:55:53

标签: .net winforms validation enterprise-library validation-application-bl

我第一次使用Validationprovider控件。我在尝试模仿我在Ent Lib安装附带的ValidationQuickStart解决方案示例中看到的功能方面取得了有限的成功。

虽然我能够根据使用验证属性装饰BO属性的Business Object验证来显示表单errorprovider图标,例如:

<NotNullValidator(MessageTemplate:="Gender must be specified.", RuleSet:="MyRule", Tag:="Gender")> _
      Public Shadows Property Gender() As String
        Get
            Return MyBase.Gender
        End Get
        Set(ByVal value As String)
            MyBase.Gender = value
        End Set
    End Property

但是,如果我想在“SelfValidation”方法中添加编辑,我如何将结果绑定到表单控件?

(In Self Validation)

If Me.Attornet s Nothing Then
    Dim result As New ValidationResult("Attorney selection is required", Me, Nothing, Nothing, Nothing)
    results.AddResult(result)
End If

或者我必须通过自己的** CUSTOM VALIDATOR创建?“然后使用其类型来装饰业务对象属性?

修改

如果ValidationProvider控件不适合像这样的交叉控制验证:

如果用户在Business Option属性Customer.DoYouSmokeCrack As Boolean对应的单选按钮组中选择“Yes”选项,那么应该使用ErrorProvider图标标记txtHowMuch控件,指示该字段是有条件的。

我现在这样做的方法是在自我验证块中执行此操作,当我将ValidationResult对象添加到集合时,我将Key属性设置为“说明”,以便GUI可以使用它来手动映射到违规的屏幕控制。

是否有更标准/更好的方式来做到这一点?

1 个答案:

答案 0 :(得分:2)

您无法使用ValidationProvider使用自我验证(或任何其他交叉属性验证)。它不起作用,因为ValidationProvider在没有业务对象的情况下工作。它的作用是加载为单个属性定义的所有验证,并使用这些验证检查给定控件的值。

跨属性验证,例如自定义验证器和自我验证确实需要完全初始化的业务对象才能工作。

如果验证很简单并且验证了单个属性(没有做任何其他事情进入数据库等),您可以编写自定义验证属性来进行验证。在所有其他情况下,您应该做的是在用户点击“保存”(您可能正在做的事情)之后创建业务对象并在该点验证对象。换句话说,您会延迟验证,直到用户提交更改为止。