首页 > 编程 > .NET > 正文

ASP.NET 2.0 ObjectDataSource控件

2024-07-10 13:09:56
字体:
来源:转载
供稿:网友

  objectdatasource控件与sqldatasource控件的对象模型是类似的。objectdatasource没有connectionstring属性,它暴露了typename属性,用于指定需要实例化的执行数据操作的对象类型(类名)。objectdatasource控件与sqldatasource的命令属性相似,也支持selectmethod、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() -> productcollection
getproductsdataset() -> dataset
getproduct (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.instock
deleteproduct (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" />

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表