如何在WCF和ASP.NET之间集成企业库验证应用程序块验证结果?

时间:2009-11-09 20:07:58

标签: asp.net wcf validation enterprise-library

企业库验证应用程序块(VAB)与ASP.NET以及WCF集成。

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

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

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

1 个答案:

答案 0 :(得分:3)

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

<强>概述

基本方法是ASP.NET页面填充DataContract对象的属性与正在验证的控件的ClientId之间的映射。发生验证错误时,ClientId作为FaultContract的一部分从服务返回到asp.net页面。然后提取FaultException中的细节; ASP.NET页面检索导致错误的控件的ClientId,并采取适当的操作(例如,更改控件外观或在验证器上设置文本)。

<强>详情

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

当Enterprise Library创建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,因此页面可以选择在其认为合适时显示消息。