ASP.NET中 ObjectDataSource控件的DataObjectTypeName属性
一、ObjectDataSource控件说明
获取或设置某个类的名称,ObjectDataSource控件将该类用于更新、插入或删除数据操作中的参数,而不是从数据绑定控件传递个别的值。
您不用指定传递给Update、Insert和Delete方法的多个参数,而是可以创建一个累计多个数据字段值的对象。仅给方法传递这一个对象,而不是多个参数。
绑定到数据绑定控件的ObjectDataSource控件的默认行为是,数据绑定控件为数据源中的每个参数创建一个Parameter对象。如果业务对象有很多字段,则结果方法也有很多字段。DataObjectTypeName属性允许您为每个数据字段都指定一个具有属性的类型。这样,运行时不是给方法传递多个参数,而是创建一个对象并设置它的所有属性。这一个对象添加到方法调用的参数集合中。
二、DataObjectTypeName属性的使用
DataObjectTypeName属性指定的类型必须有一个不带参数的默认构造函数,以便ObjectDataSource控件可以创建此类型的实例。此类型还必须具有可设置的属性,允许ObjectDataSource控件用数据绑定控件传递的值填充对象。ObjectDataSource控件的属性名应该与数据绑定控件传递的值的参数名完全匹配。
当设置了DataObjectTypeName属性并且ObjectDataSource控件与数据绑定控件关联时,由InsertMethod和DeleteMethod属性指定的方法必须各有一个在DataObjectTypeName属性中指定的类型的参数。如果ConflictDetection属性设置为OverwriteChanges值,则由UpdateMethod属性指定的方法必须有一个在DataObjectTypeName属性中指定的类型的参数。如果ConflictDetection属性设置为CompareAllValues值,则由UpdateMethod属性指定的方法必须有两个在DataObjectTypeName属性中指定的类型的参数。第一个参数包含原始值;第二个参数包含新值。
DataObjectTypeName属性委托给与ObjectDataSource控件关联的ObjectDataSourceView的DataObjectTypeName属性。
三、示例代码
下面的代码示例演示如何使用DataObjectTypeName属性,实现一个将所有参数值合并为一个对象的类型。AggregateData类的选择方法返回一个有两个名为Name和Number的列的DataTable对象。同样,NewData类定义两个读/写属性Name和Number。AggregateData类的Insert方法带NewData类型的一个参数。ObjectDataSource的TypeName属性设置为AggregateData,DataObjectTypeName属性设置为NewData。
前台代码:
<%@RegisterTagPrefix="aspSample"Namespace="Samples.AspNet.CS"Assembly="Samples.AspNet.CS"%> <%@PageLanguage="C#"%> <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <scriptrunat="server"> </script> <htmlxmlns="http://www.w3.org/1999/xhtml"> <headrunat="server"> <title>ObjectDataSource-DataObjectTypeNamePropertyExample</title> </head> <body> <formid="form1"runat="server"> <div> <asp:DetailsView ID="DetailsView1" runat="server" AllowPaging="True" AutoGenerateInsertButton="True" DataSourceID="ObjectDataSource1" Height="50px" Width="125px"> </asp:DetailsView> <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" DataObjectTypeName="Samples.AspNet.CS.NewData" InsertMethod="Insert" SelectMethod="Select" TypeName="Samples.AspNet.CS.AggregateData"> </asp:ObjectDataSource> </div> </form> </body> </html>
后台代码:
usingSystem; usingSystem.Data; usingSystem.Configuration; usingSystem.Web; usingSystem.Web.Security; usingSystem.Web.UI; usingSystem.Web.UI.WebControls; usingSystem.Web.UI.WebControls.WebParts; usingSystem.Web.UI.HtmlControls; namespaceSamples.AspNet.CS { ///<summary> ///SummarydescriptionforAggregateData ///</summary> publicclassAggregateData { publicAggregateData() { } staticDataTabletable; privateDataTableCreateData() { table=newDataTable(); table.Columns.Add("Name",typeof(string)); table.Columns.Add("Number",typeof(int)); table.Rows.Add(newobject[]{"one",1}); table.Rows.Add(newobject[]{"two",2}); table.Rows.Add(newobject[]{"three",3}); returntable; } publicDataTableSelect() { if(table==null) { returnCreateData(); } else { returntable; } } publicintInsert(NewDatanewRecord) { table.Rows.Add(newobject[]{newRecord.Name,newRecord.Number}); return1; } } publicclassNewData { privatestringnameValue; privateintnumberValue; publicstringName { get{returnnameValue;} set{nameValue=value;} } publicintNumber { get{returnnumberValue;} set{numberValue=value;} } } }