1、 - 1 - MSDN 杂志 2006 年 12 月 作者 : Rick Strahl 用自定义控件简化 ASP.NET 2.0 中的数据绑定 ASP.NET 2.0 包含许多新 的数据绑定功能,可以简化 各 种数据库绑定方案。 不幸的是, 一种常见 简单控件数据绑定 方案 并没有太大改 变 。虽然这在 窗体的 Web 应用程序中是一种常见的方案,但它 仍然是一个手动和耗时的过程。 简单控件数据绑定是指将单个值绑定到控件属性的过程。例如, 文本框、复选框 、单选按钮或列表控件的选定值之类的窗体控件绑定到单个数 据或对象 值 。 这 将使简单控件数据绑定得到 明显 改进 ,如果能够以一致的方式来
2、确定性地处理数 据绑定、管理错误的捕获和显示, 在本文中,我介绍 了 一种自定义扩展程序控件, 可以从数据或对象绑定 任意单个值 到任意控件属性。它可以 扩展和支持 Web 窗体上的任何现有控件 在这一过程中,我还将 证明 一种灵活而直观的方法,该方法可以让数据绑定和取消绑定、验证、错误处理以及在基于窗体的 Web 界面中显示错误等行为保持一致。我也 将深入探讨 这个细节 ,就是 控件 是怎样成 的 并介绍其中一些有趣的优点。 wwDataBinder 控件用于简单控件数 据绑定。具体而言,该控件管理的绑定的概念类似于: “ 将 DataRow 的 CompanyName 值绑定到 TextB
3、ox 的 Text 属性 ” 或 者 “ 将 Item.Entity.Pk 属性绑定到 DropDown 列表的 SelectedValue 属性 ” 。该控件管理的是将指定数据值绑定到指定控件属性的过程,以及取消绑定数据值 回到底层 数据项的过程。这是真正的 两种方式的 数据绑定。 数据绑定的问题 ASP.NE 提 供 了 适 当 的 本 地 支 持 。 它 的 本 地 数 据 绑 定 表 达 式 使 用 或直接页面表达式( 如 )将数据绑定到控件属性。您可以 启动数据绑定过程 ,对页面的任何控件调用 DataBind 方法来。此方法对于入站绑定而言非常好用。 尽管如此 , 也不能 取消绑定
4、并使数据重新成为 底层 数据字段或属性。 ASP.NET 2.0 介绍 了 GridView 、 FormView 和 DetailsView 控 件 , 它 们 使 你 使用 语法来提供 两种方式 数据绑定。不幸的是, 这些控 件 紧附于底 - 2 - 层数据 源 ,必须基于 IEnumerable。因 此 不支持绑定到单个实体对象。 对于本 地 取消绑定机制而言, 可能 最严重的问题或许是处理取消绑定错误的方式。如果出现与输入字段的有关的问题,例如数值字段中 有 字母字符或 DateTime 值的月份 为 22, 当您 试着 保存值时就会引发页面异常。您可以在页面级错误处理中 抓住这个异常
5、,但您不能 得到 信息,因为第一个异常将停止取消绑定过程。如果 你 有两到三个错误 在这个页面上 , 它将以混合的方式处理这些 错误,而这将造成 UI 极不友好( 虽然你 可以使用验证程序来 防止而不是处理 这个 问题)。 介绍 双向数据绑定控件 我创建了 wwDataBinder 控件,以 一种 灵活(我希望更有逻辑)的方式来管理简单数据绑定。该控件 提供了 许多 特性和功能: 支持确定 两种方式的 数据绑定 绑定 单个对象或数据值到控件属性 撤回单个对象和 数据值 到控件属性 从文本到类型化数据 处理 数据转换 管理 BindingErrors 中的 任何 绑定错误 支持 用户 验证事件
6、验证 输入 的 值 在控件附近 显示错误图标 显示 信息摘要链接到控件 以编程方 式 增 加绑定错误 要使用该控件,只需将其放置到 ASP.NET 页面上即可。该控件充 当窗体上任何现有控件的扩展程序控件,此外,它还在 Visual Studio 2005 属性编辑器中为已扩展控件添加 DataBindingItem 属性(如图 1 所示)。 - 3 - 图 1 用数据绑定功能扩展控件 (单击该图像获 得较大视图 ) 该控件在窗体上显示为一个无明显特征的灰色容器(从图 1 的底部可以看出),它在运行时并不呈现。之所以在窗体上显示该控件只是为了使您能够对 wwDataBinder 控件本身设置属性。 作为一个扩展程序控件, wwDataBinder 包含 DataBindingItem 的集合,其中 DataBindingItem 用于保存每个已扩展控件的配置值。这些项的集合编写在 HTML 标记中,该控件的代码形如: . more DataBindingItems 该集合建立 DataBinder 应用的各个绑定。虽然 wwDataBinder 可以扩展现有的控件,但只有在窗体上任意给定控件的 DataBindingItem 扩展程序属性上显式设置属