分享
 
 
 

ASP.NET2.0ObjectDataSource控件

王朝asp·作者佚名  2008-05-21
窄屏简体版  字體: |||超大  

ObjectDataSource控件与SqlDataSource控件的对象模型是类似的。ObjectDataSource没有ConnectionString属性,它暴露了TypeName属性,用于指定需要实例化的执行数据操作的对象类型(类名)。ObjectDataSource控件与SqlDataSource的?钍粜韵嗨疲?仓С钟electMethod、UpdateMethod、InsertMethod和DeleteMethod等属性,用于指明执行这些数据操作的关联类型的方法。本文将解释建立数据访问层和业务逻辑层组件,并通过ObjectDataSource对象展示ASP.NET 2.0数据组件的技术。

绑定到数据访问层

数据访问层组件封装了那些使用SQL命令查询和修改数据库的ADO.NET代码。在典型情况下,它抽象了建立ADO.NET连接和命令的细节信息,暴露了可以通过适当参数调用的方法。典型的数据访问层组件可能暴露了下面一些方法:

public class MyDataLayer {

public DataView GetRecords();

public DataView GetRecordsByCategory(String categoryName);

public DataView GetRecordByID(int recordID);

public int UpdateRecord(int recordID, String recordData);

public int DeleteRecord(int recordID);

public int InsertRecord(int recordID, String recordData);}

ObjectDataSource可以使用下面的方式来关联到这个类型:

<asp:ObjectDataSource TypeName="MyDataLayer" SelectMethod="GetRecords" UpdateMethod="UpdateRecord"DeleteMethod="DeleteRecord" InsertMethod="InsertRecord" runat="server"/>

ObjectDataSource要求对象有非常特殊的设计模式。这些约束都是Web应用程序请求所处的无状态的(stateless)环境引起的。由于在典型情况下,对象的建立和销毁都是为了服务于一个请求,因此通过对象数据源绑定的对象也是无状态的。在默认情况下,ObjectDataSource采用TypeName属性指定的类型的默认的构造函数(不带参数),尽管通过处理ObjectCreating事件来建立一个自定义对象实例,并把它指定给事件参数的ObjectInstance属性,从而实现实例化也是可行的。与SelectMethod属性关联的对象方法可以返回任何对象、Ienumerable列表、集合或数组。在上面的数据访问层示例中,DataView对象实现了IEnumerable接口。我们在下一部分将讨论到,这些方法也可以返回强化类型的集合或对象。

GetProducts() -> ProductCollectionGetProductsDataSet() -> DataSetGetProduct (int productId) -> Product

Update、Insert和Delete一般把单独的数据项字段作为参数,也可以把带有数据项字段公共属性的集合类对象作为参数。

UpdateProduct (int id, String name, double price, bool inStock)UpdateProduct (Product p) // p.ID, p.Name, p.Price, p.InStockDeleteProduct (int id)

与SqlDataSource的例子类似,传递到Update、Insert和Delete方法的数据项的参数名称或属性必须与SelectMethod返回的字段相同,这样GridView/DetailsView才能自动地进行更新/删除/插入操作。与SqlDataSource类似,ObjectDataSource方法的参数也可以与数据参数对象相关联,使用SelectParameters、FilterParameters、UpdateParameters、DeleteParameters或InsertParameters集合。

下面的例子演示了一个通过数据访问层组件(AuthorsDB)暴露数据的ObjectDataSource控件。这个类型的类文件存放在应用程序的App_Code目录中,在运行时ASP.NET动态地编译它。

<asp:ObjectDataSource ID="ObjectDataSource2" Runat="server" TypeName="AuthorsDB"SelectMethod="GetStates"/><asp:ObjectDataSource ID="ObjectDataSource1" Runat="server" TypeName="AuthorsDB"SelectMethod="GetAuthorsByState" UpdateMethod="UpdateAuthor" OldValuesParameterFormatString="{0}"><SelectParameters><asp:ControlParameter Name="state" PropertyName="SelectedValue" ControlID="DropDownList1"/></SelectParameters></asp:ObjectDataSource>

绑定到业务逻辑层

关于数据访问层,我们还需要重点的注意的是,由于SelectMethod把执行查询的结果作为数据视图返回,它仍然把下层数据库的大纲暴露给了显示页面。还有,在数据访问层没有业务规则;它只是简单地执行查询和返回结果。如果需要把显示与数据库大纲隔离开来,并引入业务规则或验证过程,通常需要把数据访问层包装到业务逻辑层中。

业务逻辑层与DAL类似,它给ObjectDataSource暴露了无状态的方法,用于绑定Web页面中的控件。但是,它一般不会直接返回ADO.NET结果,而是返回强化类型的对象,这些对象表现了应用程序所使用的业务实体。这种显示层与下层数据存储大纲的分离,使我们更容易地单独维护站点中的数据访问部分,而不用修改使用数据的页面。只要有恰当的中间层,你就可以全面修改下层数据存储大纲,而不用更新应用程序中的独立页面。

下面就是一个业务逻辑层的例子。

public class MyBusinessLayer {

public RecordCollection GetRecords();

public RecordCollection GetRecordsByCategory(String categoryName);

public RecordCollection GetRecordByID(int recordID);

public String GetRecordName(int recordID);

public Object GetRecordData(int recordID);

public int UpdateRecord(Record r);

public int DeleteRecord(Record r);

public int InsertRecord(Record r);

public int UpdateRecordData(int ID, String Data);

public int UpdateRecordName(int ID, String Name);}public class Record {

public int ID { get; set; }

public String Name { get; set; }

public Object Data { get; set; }}

业务逻辑层和数据访问层之间的主要区别在于,业务逻辑层返回的是强化类型的Record对象的集合(RecordCollection),而不是数据视图。它也允许我们把这个Record对象作为参数进行更新、插入和删除操作。ObjectDataSource的DataObjectTypeName属性允许你配置ObjectDataSource,给它传递类型而不是字段值。在业务逻辑层的方法实现中,你可以包含用于验证业务规则的自定义逻辑。例如,你可以确保只有“检查中”类别的Record才能被更新,或者只有Administrators才能插入新记录。你还可以包含验证逻辑以确保在插入或修改数据库的数据之前,作为参数传递进来的数据类型和值是正确的。请注意,业务逻辑层中的验证规则不是显示层的输入验证(它指导终端用户在提交更新之前输入正确的值)的替代品。

下面的例子演示了一个叫做AuthorsComponent的简单业务逻辑层。在它内部,BLL通过DAL调用来实际执行数据库操作。为了简单,BLL没有包含任何业务规则或验证,尽管它可能是一个现实的应用程序。我们还要注意,这个例子没有通过编写自定义集合类来返回强化类型的记录,而是利用了.NET框架组件2.0中的称为“范型(Generics)”的新语言特性来建立Author对象集合。使用强化类型集合让ObjectDataSource在设计时(在Visual Studio和其它工具中)能够推导出业务对象的大纲。

<asp:DropDownList ID="DropDownList1" Runat="server" DataSourceID="ObjectDataSource2" AutoPostBack="True" /><asp:ObjectDataSource ID="ObjectDataSource2" Runat="server" TypeName="AuthorsComponent" SelectMethod="GetStates"/><asp:GridView ID="GridView1" Runat="server" DataSourceID="ObjectDataSource1" AutoGenerateColumns="False" AllowPaging="True" AllowSorting="True">……</asp:GridView><asp:ObjectDataSource ID="ObjectDataSource1" Runat="server" TypeName="AuthorsComponent" SelectMethod="GetAuthorsByState" UpdateMethod="UpdateAuthor" DataObjectTypeName="Author" SortParameterName="sortExpression">……</asp:ObjectDataSource>

下面的图表显示了GridView、ObjectDataSource和业务逻辑层之间的交互操作。ObjectDataSource被配置为调用ContactsList类型的GetContacts方法,返回Contact对象的集合。GridView列出了Contact对象,并直接绑定到该类型的属性(ID, Name)来生成列。请注意,SelectMethod可以返回一个Contact对象的IEnumerable接口,或者返回单个Contact对象。如果本身没有实现IEnumerable,ObjectDataSource会把SelectMethod返回的结果封装到IEnumerable中。

ObjectDataSource控件与SqlDataSource类似,当SelectMethod 返回数据集、数据视图或数据表对象的时候,它也支持排序功能。ObjectDataSource依赖数据视图。在这个例子中Sort属性执行排序操作。ObjectDataSource也支持SelectMethod实现中的自定义排序,如果该方法没有返回数据集、数据视图和数据表,它就非常有用。通过把SortParameterName属性设置为从数据源接受SortExpression的方法参数名称,可以实现自定义排序。在调用SelectMethod的时候,ObjectDataSource会把这个表达式传递到你的方法中,你就可以使用这个表达式实现自己的排序逻辑。前面的例子演示了在AuthorsComponent类中自定义了一个排序实现。

ObjectDataSource还支持SelectMethod实现中的自定义分页功能。你需要使用StartRowIndexParameterName、MaximumRowsParameterName和SelectCountMethod属性来设置它。

绑定到Visual Studio数据集

绑定数据访问层的操作可能很单调乏味,因为在DAL的不同方法中,执行SQL语句或存储过程的ADO.NET代码时相同的或相似的。虽然你可以利用上述技术数用定制的ADO.NET代码来编写自己的DAL,Visual Studio还是提供了一条基于简单的向导生成数据访问层的方便途径。在这种情况下,数据访问层是强化类型的数据集对象。该数据集包含了TableAdapter类型,它暴露了用于返回强化类型的数据表对象的方法。这些方法适合于直接绑定到ObjectDataSource,或者在业务逻辑层组件中调用。

为了给Visual Studio对象添加数据集,你需要右键点击“解决方案浏览器”并选择“添加新项”,接着选择“数据集”项类型。Visual Studio给App_Code目录添加了一个DataSet.xsd文件,并打开了数据集设计器,载入了TableAdapter向导。你可以跟随TableAdapter向导,指定数据库中的SQL语句或存储过程,接着在向导的最后一个页面中输入与这些查询/命令关联的方法名称。

TableAdapter可以暴露两个方法:Fill方法用于填充已有的数据集,Get方法返回一个已经填充好的数据表对象。前者更适合于Windows客户端(在应用程序的生命周期中数据集保存在内存中),而后者适合于ObjectDataSource。TableAdapter向导还为你提供的SQL选择语句自动地生成了更新、插入和删除方法(需要选择主键)。在配置好向导之后,Visual Studio给数据集设计器添加了一个新的数据表和TableAdapter类型。

TableAdapter描述了单个结果集的大纲和大纲上的选择、更新、插入或删除操作。你可以通过在数据集设计器中右键单击,给数据集添加多个TableAdapter。你还可以右键点击设计器中的TableAdapter框给TableAdapter添加额外的查询(倘若它们返回相同的大纲)。例如,你的TableAdapter可能同时包含了GetAuthors()和GetAuthorsById(int id) 方法,但是如果要添加GetTitles()方法,可能需要添加一个新的TableAdapter。下图显示了添加了多个TableAdapter的数据集设计器:

你完成数据集的设计之后,就可以保存DataSet.xsd文件了(它引起该类型被设计器后台编译,以供页面使用)。你可以看到暴露给页面代码的这些类型:

protected void Page_Load(object sender, EventArgs e){

DataSetTableAdapters.PhotosTableAdapter adapter = new

DataSetTableAdapters.PhotosTableAdapter();

adapter.GetPhotosForAlbum(0);}

但是,你不需要从自己的代码中调用这些方法。你可以把ObjectDataSource绑定到这些方法:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"TypeName="DataSetTableAdapters.PhotosTableAdapter"SelectMethod="GetPhotosForAlbum"><SelectParameters><asp:QueryStringParameter Name="albumID" QueryStringField="id" Type="Int32"/></SelectParameters></asp:ObjectDataSource>

下面的例子演示了一个绑定到DataSet.TableAdapter方法的ObjectDataSource。在后面几个例子中我们将使用这个数据集演示如何使用ASP.NET数据控件实现一个简单的相册应用程序。请注意这个例子中的数据视图使用了一个叫做ImageField的新字段类型来显示照片。我们还要注意,ObjectDataSource中使用的ConvertNullToDBNull会导致空参数值在传递给TableAdapter方法之前被转换为DbNull(必须的)。

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" TypeName="DataComponentTableAdapters.AlbumsTableAdapter"SelectMethod="GetAlbumsByOwner" UpdateMethod="Update" ConvertNullToDBNull="true" OldValuesParameterFormatString="original_{0}"></asp:ObjectDataSource><asp:ObjectDataSource ID="ObjectDataSource2" runat="server" TypeName="DataComponentTableAdapters.OwnersTableAdapter" SelectMethod="GetOwners" />

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有