2009-11-09 70 views
2

企业库验证应用程序块(VAB)与ASP.NET集成,也与WCF集成。如何在WCF和ASP.NET之间集成企业库验证应用程序块验证结果?

有没有办法将WCF中创建的ValidationResults与ASP.NET集成?

例如一个ASP.NET网页调用一个WCF服务。 WCF服务使用VAB验证数据并通过FaultContract返回验证信息。 ASP.NET页面可以获取结果并显示一些错误消息。然而,通常的做法是指出哪些字段有错误(例如内联消息或星号)。看来,这些方法中的大多数将涉及能够将验证结果与控件或验证器相关联。

我不认为有一个开箱即用的解决方案,但也很好奇,如果有人做到了这一点,他们的做法是什么。

回答

3

由于没有开箱即用的解决方案,并且没有发布任何答案,我将分享我实施的内容。我并不喜欢这种方法,但它对我有用。

概述

的基本方法是对于ASP.NET页面来填充属性之间的映射上DataContract对象到被验证了控制的客户端Id。当发生验证错误时,ClientId作为FaultContract的一部分从服务返回到asp.net页面。然后提取FaultException中的详细信息; ASP.NET页面将检索导致错误的控件的ClientId,并且可以采取适当的操作(例如,更改控件的外观和感觉或将文本设置在验证器上)。

详细

所有DataContract对象从暴露字典的基类继承。该字典用于将对象属性映射到ASP.NET控件。在Dictionary中,键是DataContract对象上的属性名称,值是控件的ClientId。在调用服务之前,客户端必须将Dictionary添加到DataContract对象。

当企业库创建ValidationResult时,它包含名为Target的属性,它是经过验证的对象。 ValidationResult还包含一个名为key的属性,它是来自经过验证的目标对象的属性名称。 ValidationResult键也是在调用服务之前在ASP.NET页面中设置的Dictionary中的一个键。

使用ValidationResult键,可以从ValidationResult目标中提取ASP.NET提供的信息(ClientId)。这些信息将作为ValidationResult的标签添加。不幸的是,Tag是一个只读属性,所以它必须通过创建一个新的ValidationResult并将该标签传递给构造函数来进行设置。

然后将ValidationResults的集合转换为我们需要使用的预先存在的CustomValidationResults集合(与ValidationResult类似)。然后将CustomValidationResults添加到自定义的ValidationFault并引发FaultException。

然后从ASP.NET页面中的FaultException中提取ValidationFaults。 ValidationFault包含与错误关联的控件的ClientId,以便页面可以选择显示它认为合适的消息。