【问题标题】:How to Integrate Enterprise Library Validation Application Block ValidationResults between WCF and ASP.NET?如何在 WCF 和 ASP.NET 之间集成企业库验证应用程序块验证结果?
【发布时间】:2009-11-09 20:07:58
【问题描述】:
企业库验证应用程序块 (VAB) 与 ASP.NET 以及 WCF 集成。
有没有办法将 WCF 中创建的 ValidationResults 与 ASP.NET 集成?
例如ASP.NET 网页调用 WCF 服务。 WCF 服务使用 VAB 验证数据并通过 FaultContract 返回验证信息。 ASP.NET 页面可以获取结果并显示一些错误消息。但是,一种常见的方法是指出哪些字段有错误(例如内联消息或星号)。似乎这些方法中的大多数将涉及能够将验证结果与控件或验证器相关联。
我认为没有开箱即用的解决方案,但我也很好奇是否有人这样做以及他们的方法是什么。
【问题讨论】:
标签:
asp.net
wcf
validation
enterprise-library
【解决方案1】:
由于没有开箱即用的解决方案,也没有发布任何答案,我将分享我实施的方案。我不喜欢这种方法,但它对我有用。
概述
基本方法是让 ASP.NET 页面填充 DataContract 对象上的属性与正在验证的控件的 ClientId 之间的映射。当发生验证错误时,ClientId 作为 FaultContract 的一部分从服务返回到 asp.net 页面。然后从 FaultException 中提取详细信息; ASP.NET 页面检索导致错误的控件的 ClientId,然后可以采取适当的操作(例如更改控件外观或在验证器上设置文本)。
详情
所有 DataContract 对象都继承自公开 Dictionary 的基类。此字典用于将对象属性映射到 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,因此页面可以选择显示它认为合适的消息。