ASPNET2 数 据 绑 定.docx
- 文档编号:26611181
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:51
- 大小:240.80KB
ASPNET2 数 据 绑 定.docx
《ASPNET2 数 据 绑 定.docx》由会员分享,可在线阅读,更多相关《ASPNET2 数 据 绑 定.docx(51页珍藏版)》请在冰豆网上搜索。
ASPNET2数据绑定
80
第章
数据绑定
在ASP.NET2.0中,对数据绑定功能做了大量的改进。
这些改进分为几个不同的区域。
新引进了一个使用DataSource控件的概念,它提供了数据提供程序和可视化元素(即Web控件)之间的联系。
已有的控件也做了适当的修改,以支持从DataSource控件中获取数据。
还添加了新控件,以满足已有控件未充分满足的需求。
例如,GridView和DetailsView就是两个新控件,本章将详细探讨它们,研究如何在应用程序中更高效地使用数据绑定。
第7章也介绍了GridView。
在ASP.NET2.0推出之前,编程调用定制方法,从数据库/提供程序中获取数据所需的数据绑定,与设置控件上的一个或多个属性之间的联系都是基于数据的。
DataSource控件概念不仅允许使用SQLDataSource绑定到从数据库查询返回的数据上,还通过XMLDataSource和使用ObjectDataSource的对象扩展到XML上。
使用DataSource控件,允许控件请求需要的数据,从而大大减少了完成数据提取所需的定制编码量。
事情总是这样:
添加的特性越多,想要的特性也就越多。
ASP.NET2.0不仅使数据绑定变得非常简单,还使之可用于建立“真正”的应用程序。
当然,在大多数产品中,其开发周期总是没有足够的时间包含每个用户需要的每个特性。
另外,如果包含所有的特性,就没人会使用该产品了,因为它太复杂了,根本无法管理。
本章选择介绍已发布的产品,提供使数据绑定更易于使用的一些新方式,从而提高效率。
我们将讨论如何继承自己的DataSource控件,这样可以用自己的定制控件扩展内置的控件,并使之可以在应用程序中重用。
之后,描述如何使用代码生成工具建立拖放式控件,帮助减少每个页面上的多余信息。
添加了继承的DataSource控件后,接着添加改进默认值处理方式的支持。
之后考虑XMLDataSource,探讨如何支持ObjectDataSource调用业务对象的方式,并使之可用于XML。
最后,解释如何建立与DataSource控件一起使用的定制参数。
没有UI控件,数据绑定的讨论就不可能完成,所以我们还将探讨建立定制字段的方式。
8.1继承自己的DataSource控件
使用DataSource控件时,无论是使用SQLDataSource、ObjectDatasource或其他类型,都是把控件从工具箱拖放到Web窗体上。
控件位于Web窗体上后,就要开始配置它,设置必要的选项。
如果只有一个页面要使用DataSource控件,这就很合适,因为该控件只使用一次。
下面看看在20个不同页面上使用产品列表的例子。
此时使用DataSource控件并不方便,定制工作也不少,但我们总是在寻找减少工作量的机会。
在这个例子中,同样的工作要重复多次,以设置每个页面上的选项。
更糟糕的是,在控件发生变化时,必须访问全部20个页面,来更新控件。
这也会导致如下问题:
如果高速缓存数据,而某个参数发生了变化,20个页面在高速缓存中都会保留它自己的副本,而不是共享一个数据副本。
在激活高速缓存的SQLDataSource上执行SQL查询,就会产生这种情况。
本章将详细讨论的一种方式是创建一个定制的DataSource控件,它继承了内置的DataSource控件,并预先配置了产品列表的公共选项。
使用这种方式,不仅减少了配置每个页面上控件的定制工作,还提高了页面的一致性。
如果必须进行修改,可以修改定制的继承控件,而不是查找全部20个使用DataSource控件的页面,以检索产品列表。
另外,现在或将来会出现可以在所有DataSource控件上使用的公共函数或属性。
例如,如果使用DataSource控件进行插入操作,就希望能设置默认选项,且无需编写代码。
本章的后面将建立第一个继承控件,来添加这个定制功能,由与应用程序相关的DataSource控件使用。
首先用一个例子来具体描述一下概念。
为了便于讨论,本章将使用ObjectDataSource控件,但其概念和方法也可以用于其他DataSource控件,例如SQLDataSource。
首先创建一个继承了ObjectDataSource的类。
这个类由许多应用程序控件使用,所以最好把它放在一个公共类库中。
第2章详细探讨了建立和使用公共类库的原因和优点。
在这个例子中,把类称为MVPHacksObjectDataSource。
在自己的应用程序中,可以把它命名为任意名称,但应尽可能使它与具体的应用程序无关。
下面是示例代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Web.UI.WebControls;
namespaceMVPHacks.Common.DataBinding
{
publicclassMVPHacksObjectDataSource:
ObjectDataSource
{
}
}
在上面的例子中,我们只是继承了内置的ObjectDataSource控件,没有添加任何额外的功能。
这么做,并用它替代内置的ObjectDataSource,可以在将来添加功能,且无需逐个修改页面。
现在,如果引用公共库,查看Web窗体上的工具箱,刚才继承的控件MVPHacksObjectDataSource就会自动显示出来,以供在页面上使用,如图8-1所示。
这个新控件可以像内置的ObjectDataSource那样使用——把它从工具箱中拖出来,或在DataSourceConfigurationWizard中选择它。
图8-1
8.2使用数据源配置向导
在由VisualStudio2005自动执行的一些主题中,我们要讨论DataSourceConfigurationWizard。
把一个GridView或其他支持数据绑定的控件拖放到页面上时,就会启动这个向导。
其作用是允许选择要使用的DataSource控件,并把它绑定到控件上。
使用上一节创建的代码,MVPHacksObjectDataSource控件就会在列表中显示为一个ObjectDataSource控件,这可能会产生混淆,如图8-2所示。
图8-2
为了增强使用控件的体验,消除混乱,可以给类添加DisplayName和Description特性,以提供更有意义的信息。
下面的例子使用这两个特性修改了类:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Web.UI.WebControls;
usingSystem.ComponentModel;
namespaceMVPHacks.Common.DataBinding
{
[DisplayName("MVPHacksODS"),Description("MVPHacksCustom
ObjectDataSource")]
publicclassMVPHacksObjectDataSource:
ObjectDataSource
{
}
}
如果在添加特性后,查看显示在向导中的DataSource类型,就可以清楚地看到自己的定制控件及其相关描述,如图8-3所示。
图8-3
添加特性可以清晰地标识类,在开始建立与应用程序相关的DataSource控件时,这一点将变得更重要。
想象一下打开向导,在列表中有20项都是Object,会是一种什么情形。
现在以刚才创建的控件为基础,建立一个与应用程序相关的控件。
为此,创建一个继承自MVPHacksObjectDataSource的类ProductListODS。
可以使该类继承自ObjectDataSource,但这会丧失未来添加到MVPHacksObjectDataSource控件上的特性。
为了使例子比较简单,只考虑建立与应用程序相关的DataSource控件,我们使用下述非常简单的类,作为要为产品列表建立的、与应用程序相关的DataSource控件。
下面的代码演示了一个数据类的示例,它包含属性和面向对象的方法,之后是一个数据库访问类的简化示例。
注意,这里没有演示它们要完成的工作,而说明了它们如何在概念上与ObjectDataSource一起使用,进行数据绑定。
下面是Product数据类:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceMVPHacks.Common.Products
{
publicclassProduct
{
privateintm_ProductID;
publicintProductID
{
get{returnm_ProductID;}
set{m_ProductID=value;}
}
privatestringm_Name;
publicstringName
{
get{returnm_Name;}
set{m_Name=value;}
}
privateintm_ProductStatus;
publicintProductStatus
{
get{returnm_ProductStatus;}
set{m_ProductStatus=value;}
}
}
}
下面的代码是一个类,它包含的方法将与数据库交互。
这里没有执行方法,只是演示像这样的类如何与DataSource控件交互。
实际上,这两个类可以根据具体的体系结构来分开或合并:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceMVPHacks.Common.Products
{
publicclassDBProduct
{
publicintCreateProduct(Productproduct)
{
//reallogictocreateproductgoeshere
return-1;
}
publicProductGetProductByID(intproductID)
{
returnnewProduct();
}
publicList
{
returnnewList
}
publicvoidUpdateProduct(Productproduct)
{
//updatelogicgoeshere
}
publicvoidDeleteProduct(intproductID)
{
//deletelogicgoeshere
}
}
}
如果要把这些类用于MVPHacksObjectDataSource控件,就在VisualStudio中,进入使用该控件的Web窗体的source视图,得到如下代码:
MVPHacksObjectDataSourceID="MVPHacksObjectDataSource1" runat="server" DataObjectTypeName="MVPHacks.Common.Products.Product" DeleteMethod="DeleteProduct"InsertMethod="CreateProduct" SelectMethod="GetProductByID" TypeName="MVPHacks.Common.Products.DBProduct" UpdateMethod="UpdateProduct"> ParameterName="productID"Type="Int32"/> QueryStringParameterDefaultValue="0"Name="productID" QueryStringField="ID" Type="Int32"/>
MVPHacksObjectDataSource>
上面的标记会在每个使用该控件的页面上重复出现。
如前所述,如果激活了高速缓存,这些选项也会在标记中重复出现。
下面的代码示例演示了建立与应用程序相关的DataSource控件的第一个尝试。
该例子演示了继承MVPHacksObjectDataSource。
类继续在DataSource控件的每个相关属性上建立方法。
注意,在设计器中为控件提供描述和名称的特性也设计为与应用程序相关,这对使用该控件的环境是有意义的。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.ComponentModel;
usingSystem.Web.UI.WebControls;
usingMVPHacks.Common.DataBinding;
namespaceMVPHacks.Common.WebControls
{
[DisplayName("ProductEditODS"),Description("EditProductData
Source")]
publicclassProductEditODS:
MVPHacksObjectDataSource
{
publicProductEditODS()
{
SetupDefaultControlInfo();
}
privatevoidSetupDefaultControlInfo()
{
this.DataObjectTypeName="MVPHacks.Common.Products.Product";
this.TypeName="MVPHacks.Common.Products.DBProduct";
this.InsertMethod="CreateProduct";
this.DeleteMethod="DeleteProduct";
this.SelectMethod="GetProductByID";
this.UpdateMethod="UpdateProduct";
}
}
}
上面的DataSource控件显示在工具箱上,可以把它拖放到Web窗体上。
如果运行了DataSourceConfigurationWizard,该控件也会显示出来。
查看一下HTML标记,它比上述例子简单得多,如下面的代码所示:
ProductEditODSID="ProductEditODS1"runat="server">
ProductEditODS>
标记比上述例子简单有两个原因。
第一,继承的类负责设置方法和对象的类型名。
第二,没有处理Delete和Select的参数,来指定DataSource控件从哪里提取这些值。
要处理这些参数,必须设置几个选项。
如果查看DataSource控件的属性,就可以单击Select或Delete参数属性,打开ParameterCollectionEditor。
由于目前什么也没有定义,所以列表是空的。
另一个选项是添加到继承的DataSource控件上,根据最常见的情形建立一个默认属性集。
如果这么做,即使需要调整这些属性,以便在某个页面上使用,PropertyCollectionEditor一开始也会有一些默认值。
下面的方法可以在继承的DataSource控件上建立参数:
privatevoidSetupDefaultControlParameters()
{
QueryStringParameterqsProductID=newQueryStringParameter();
qsProductID.Name="ProductID";
qsProductID.QueryStringField="ID";
qsProductID.Type="Int32";
qsProductID.DefaultValue="0";
this.SelectParameters.Add(qsProductID);
ControlParametercpProductID=newControlParameter();
cpProductID.Name="ProductID";
cpProductID.Type="Int32";
this.DeleteParameters.Add(cpProductID);
}
使用继承了DataSource、与应用程序相关的控件,有助于减少每次在页面上使用控件时所需的定制编码量。
控件一开始就有一致的选项集也是有帮助的,除了保证一致性之外,还可以通过确保高速缓存共享数据的一个副本来优化资源。
8.2.1添加控件设计器
看看拖放到Web窗体上的DataSource控件(包括ASP.NET内置的DataSource控件),它只显示了一个带名称的灰框,如图8-4所示。
图8-4
我们可以指定一个ControlDesigner类,来替代该控件在设计期间的默认显示。
为此,必须先在项目中引用System.Design程序集,该程序集包含了System.Web.UI.Design.ControlDesigner的基类,只有继承这个基类,才能建立控件设计器。
仔细看看ObjectDataSource,会发现它已经有一个设计器System.Web.UI.Design.WebControls.ObjectDataSourceDesigner,这个设计器负责显示常见任务的热链接,但在Web窗体设计器视图中,没有以提供丰富信息的方式显示。
为了确保不丧失该设计器已有的特性,应继承这个已有的设计器,而不是继承System.Web.UI.Design.ControlDesigner类。
下面要添加一个继承自ObjectDataSourceDesigner的新类,重写GetDesignTimeHtml方法。
GetDesignTimeHtml方法由VisualStudio设计器调用,来获得设计期间为控件显示的标记。
在本例中,要输出控件的类型、ID和对象的类型名。
这个方法很容易定制项目中有用的内容:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceMVPHacks.Common.DataBinding
{
publicclassMVPHacksObjectDataSourceDesigner:
System.Web.UI.Design.WebControls.ObjectDataSourceDesigner
{
///
///
///
///
publicoverridestringGetDesignTimeHtml()
{
MVPHacksObjectDataSourcemvpODS=
(MVPHacksObjectDataSource)this.Component;
StringBuilderhtmlSB=newStringBuilder();
htmlSB.AppendFormat("{0}-{1}
",mvpODS.GetType().Name,
mvpODS.ID);
if(mvpODS.TypeName!
=null)
htmlSB.AppendFormat("Type={0}
",mvpODS.TypeName);
if(mvpODS.DataObjectTypeName!
=null)
htmlSB.AppendFormat("DataType={0}
",
mvpODS.DataObjectTypeName);
returnhtmlSB.ToString();
}
}
}
在上面的代码示例中,使用了this.Component属性,所以设计器可以访问当前正在使用的控件实例。
把该实例转换为控件的指定类型,就可以访问该控件的各种特定属性。
注意,并不是所有的环境属性都可以在设计模式下使用,试图访问不能使用的属性会导致错误。
控件可以使用IsDesignMode属性确定当前模式。
在本例中,由于我们是设计人员,所以当前处于设计模式,否则方法是不能调用的。
为了在服务器控件上使用设计器,必须添加一个特性,告诉VisualStudio应使用什么类提供设计视图中的显示。
下面是添加了designer特性的MVPHacksObjectDataSource:
[DisplayName("MVPHacksODS"),Description("MVPHacksCustom
ObjectDataSource")]
[Designer("MVPHacks.Common.DataBinding.MVPHacksObjectDataSourceDesigner")]
publicclassMVPHacksObjectDataSource:
ObjectDataSource
{
}
图8-4是内置控件提供的显示,图8-5是修订后的控件提供的显示。
注意,现在不仅仍可以执行常见任务,还可以在Web窗体上查看DataSource的一些有用信息,且无需通过控件的属性来查看。
图8-5
在建立服务器控件时,控件设计器是一个包含许多技巧的好工具。
在这个例子中,说明了如何使用设计器更方便地使用控件,这个技巧可以应用于许多其他控件上,以提供更丰富的设计体验。
8.2.2生成与应用程序相关的DataSource控件
目前,某些形式的代码生成器常常用于减少开发人员的手动编码工作,提高代码的一致性。
本章前面讨论的主题也是这样。
采用某种代码生成工具,建立与应用程序相关的DataSource控件,将进一步简化该控件的使用,不需要在每个页面上进行配置DataSource控件的准备工作。
选择什么代码生成技术并不重要,有许多这方面的技术供我们选择。
同样,选择在哪个级别上生成控件,或者是使用ObjectDataSource还是SQLDataSource,也不是很重要。
重要的是基本概念:
使用选中的工具,可以生成以前使用的控件,它们出现在工具箱中,可以由项目组的开发人员用于建立Web窗体。
某些技术很重要,但就这里的讨论而言,不论述这个问题。
这个概念的一个比较具体的例子是建立一个包含37个表的应用程序数据库(当然,37是一个随意的数字)。
在这个概念最简单的实现方式中,使用工具生成37个DataSourc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ASPNET2