日期:2014-02-25  浏览次数:20434 次

John Dyer
Dallas Theological Seminary

适用于:
Microsoft Visual Studio 2005 及早期版本
ASP.NET 1.1
C# 编程语言
Visual Basic 编程语言

摘要:使用反射以单行代码将业务对象绑定到 ASP.NET Web 窗体,从而降低复杂性并减少错误。(本文包含一些指向英文站点的链接。请注意,在示例文件中,程序员的注释使用的是英文,本文中将其译为中文是为了便于读者理解。)

下载 MSDFormBinding.msi 示例文件。

*
本页内容
引言引言简化和缩短窗体代码简化和缩短窗体代码开始:从反射中检索属性列表开始:从反射中检索属性列表将对象属性值绑定到控件将对象属性值绑定到控件用已知属性设置未知控件的值用已知属性设置未知控件的值反转过程:BindControlsToObject反转过程:BindControlsToObject性能和 FormBinding 方案的扩展性能和 FormBinding 方案的扩展结论结论参考资料参考资料

引言

在 Web 开发人员的最常见任务之中,有一项任务是他们要反复执行的:建立更新数据库表的简单窗体。我们将创建一个列表页面和一个窗体页面,列表页面中以表格形式显示记录,窗体页面中带有用于各个数据库字段的适当的窗体控件。许多开发人员还使用表示数据库表的业务对象将代码组织到分为多层的设计中。如果以业务对象 (Document) 来表示数据库表 (Documents),许多窗体的代码看上去将如下所示:

<script runat="server">protected void Page_Load(Object Src, EventArgs E) {if (!IsPostBack) {   Document document =         Documents.GetDocument(Request.QueryString["DocumentID"]);   Title.Text = document.Title;   Active.Checked = document.Active;   CreatedDate.Text = document.CreatedDate.ToString();   AuthorID.FindByValue(document.AuthorID.ToString()).Selected =         true;   // ... 等等   HtmlBody.Text = document.HtmlBody;}}protected void SaveButton_Click(Object Src, EventArgs E) {   Document document =         Documents.GetDocument(Request.QueryString["DocumentID"]);   document.Title = Title.Text;   document.Active = Active.Checked;   document.CreatedDate = Convert.ToDateTime(CreatedDate.Text);   document.AuthorID = Convert.ToInt32(AuthorID.SelectedItem.Value);   // ... 等等   document.HtmlBody = HtmlBody.Text;   Documents.Update(document);}</script>
返回页首返回页首

简化和缩短窗体代码

在以上代码中,对每个控件进行显式转换,并将其设置为窗体控件的正确属性。根据属性和窗体控件的数量,这部分代码可能会变长并难以管理。代码还应包含类型转换的错误更正和 ListControl,这将进一步增加复杂性。即使窗体是由代码生成工具(例如 Eric J. Smith 的优秀的 CodeSmith)生成的,当需要任何自定义逻辑关系时,很容易引入错误。

使用反射,可以仅使用单行代码便将业务对象的所有属性绑定到相应的窗体控件,从而减少代码的行数并增强可读性。完成反射系统的建立后,以上代码将简化为:

protected void Page_Load(Object Src, EventArgs E) {   if (!IsPostBack) {      Document document =      Documents.GetDocument(Request.QueryString["DocumentID"]);