ASP.NET2.0快速入门--绑定到对象板(后来才发现,忘了)

ASP.NET2.0快速入门--绑定到对象(后来才发现,忘了这节,今天补上)
原文:http://www.asp.net/QuickStart/aspnet/doc/data/objects.aspx


绑定到对象

前一节演示了将控件绑定到 SqlDataSource,后者支持用于指定连接字符串、SQL 语句或存储过程的属性,用以查询或修改数据库。虽然这适合大多数小规模的个人或业余站点,但对于较大规模的企业级应用程序,在应用程序的呈现页中直接存储 SQL 语句可能很快就会变得无法维护。这些应用程序通常需要用中间层数据访问层或业务组件构成的封装性更好的数据模型。所幸 ASP.NET 数据源控件模型使用 ObjectDataSource 控件支持这种方法。

 

ObjectDataSource 控件对象模型类似于 SqlDataSource 控件。ObjectDataSource 公开一个 TypeName 属性(而不是 ConnectionString 属性),该属性指定要实例化来执行数据操作的对象类型(类名)。类似于 SqlDataSource 的命令属性,ObjectDataSource 控件支持诸如 SelectMethodUpdateMethodInsertMethod DeleteMethod 的属性,用于指定要调用来执行这些数据操作的关联类型的方法。本节介绍一些方法,用于构建数据访问层和业务逻辑层组件并通过 ObjectDataSource 控件公开这些组件。

 

 

 

绑定到数据访问层

数据访问层组件封装 ADO.NET 代码以通过 SQL 命令查询和修改数据库。它通常提炼创建 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 应用程序请求的无状态环境施加的。由于为每个请求提供服务通常都要创建和销毁对象,通过对象数据源绑定的对象也需要是无状态的。默认情况下,ObjectDataSource 假定 TypeName 属性所指定的类型具有默认构造函数(无参数),不过,通过处理 ObjectCreating 事件来创建自定义对象实例并将它指定给事件参数的 ObjectInstance 属性,也可以代表 ObjectDataSource 实例化该类型。与 SelectMethod 属性关联的对象方法可以返回任何 Object 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 示例一样,传递给 UpdateInsert Delete 方法的数据项的参数名称或属性必须与 SelectMethod 返回的数据项字段的名称相匹配,GridView/DetailsView 自动更新/删除/插入才能正常工作。正如 SqlDataSourceObjectDataSource 方法的参数可以与指定给 SelectParametersFilterParametersUpdateParametersDeleteParameters InsertParameters 集合的数据参数对象相关联。

 

下面的示例演示一个 ObjectDataSource 控件,该控件从名为 AuthorsDB 的数据访问层组件公开数据。该类型的类文件放在应用程序的 App_Code 目录中,由 ASP.NET 在运行时动态编译。

 

 

 

C# Binding to a Data Access Layer

 

 

 

 

绑定到业务逻辑层

关于数据访问层,需要重点注意这一点,由于 SelectMethod 将执行查询的结果作为 DataView 返回,它仍然向呈现页公开基础数据库的架构。需要注意另一点,数据访问层中没有业务规则;它只是执行查询并返回结果。为了将呈现与数据库架构隔离开来并引入业务规则或验证,数据访问层通常包装在业务逻辑层中。

 

业务逻辑层类似于 DAL,因为它也向 ObjectDataSource 公开无状态的方法,用于在网页中绑定控件。但是,它不直接返回 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,而不是返回 DataView。它还允许接受该 Record 对象作为参数的 UpdateInsert Delete 操作。ObjectDataSource DataObjectTypeName 属性允许配置 ObjectDataSource 将该类型而不是各字段值传递给方法。在业务逻辑层方法实现中,可以包含用于验证业务规则的自定义逻辑。例如,可以确保只能更新“In Review”(正在审阅)类别中的 Record,或者只有管理员才能插入新记录。还可以提供验证逻辑以便在数据库中插入或修改数据之前,确保作为参数提供的数据类型和值是正确的。注意,业务层中的验证逻辑不是呈现层中的输入验证的替代项,输入验证帮助指导最终用户在提交更新前输入正确的值。

 

下面的示例演示一个名为 AuthorsComponent 的简单业务逻辑层。该 BLL 在内部一直调用到 DAL 以实际执行数据库操作。简单起见,该 BLL 未包含任何业务规则或验证,但在实际应用程序中会有业务规则或验证。另请注意,此示例不编写自己的自定义集合类来返回强类型记录,而是利用 .NET Framework 2.0 中称为泛型的新语言功能创建 Author 对象的集合。使用强类型集合允许 ObjectDataSource 在设计时推导出业务对象的架构(在 Visual Studio 和其他工具中)。

 

 

 

C Binding to a Business Logic Layer

 

 

下面的插图演示 GridViewObjectDataSource 和业务逻辑层之间的交互。ObjectDataSource 被配置为调用 ContactsList 类型的 GetContacts 方法,该方法返回 Contact 对象的集合。GridView 枚举这些 Contact 对象,并直接绑定到该类型的属性(IDName)以产生列。注意,SelectMethod 可以返回 Contact 对象的 IEnumerable,也可以返回单一实例 Contact 对象。如果 ObjectDataSource 本身不实现 IEnumerable,它将始终在 IEnumerable 中包装 SelectMethod 的结果。

 

 

SqlDataSource 一样,当 SelectMethod 返回 DataSetDataView DataTable 对象时,ObjectDataSource 控件支持排序。这种情况下,ObjectDataSource 在内部依赖 DataView.Sort 属性执行排序。ObjectDataSource 还在 SelectMethod 实现中支持自定义排序,如果该方法不是返回 DataSetDataView DataTable,则这种排序十分有用。自定义排序的配置是通过将 SortParameterName 属性设置为某个方法参数名进行的,该方法参数接受数据源的 SortExpression。当 SelectMethod 被调用时,ObjectDataSource 将该表达式传递给方法,您可以使用该表达式实现自己的排序逻辑。上面的示例演示了 AuthorsComponent 类中的一个自定义排序实现。

 

ObjectDataSource SelectMethod 实现中还支持自定义分页。这是使用 StartRowIndexParameterNameMaximumRowsParameterName SelectCountMethod 属性配置的,并将在本教程的高级分页和排序部分中详细讨论。

 

 

 

绑定到 Visual Studio 数据集

构建数据访问层可能很乏味,因为对于 DAL 的不同方法,执行 SQL 语句或存储过程的 ADO.NET 代码通常是相同或相似的。尽管可以使用上述方法和自定义 ADO.NET 代码编写自己的 DALVisual Studio 还是提供了一种方便的方式,可以根据简单向导的输入生成数据访问层。这种情况下的数据访问层是强类型 DataSet 对象。DataSet 包含 TableAdapter 类型,这些类型公开用于返回强类型 DataTable 对象的方法。这些方法适合用于直接绑定到 ObjectDataSource,也适合用于从业务逻辑层组件进行调用。

 

若要向 Visual Studio 项目添加 DataSet,请右击解决方案资源管理器并选择添加新项...”,然后选择“DataSet”项目项类型。Visual Studio 可能提示将该项添加到 App_Code 目录;请对此提示回答继续。Visual Studio App_Code 目录添加一个 DataSet.xsd 文件并打开 DataSet 设计器,并默认运行 TableAdapter 向导。逐步完成 TableAdapter 向导,您可以指定 SQL 语句或数据库中的存储过程,然后在向导的最后一页上命名与这些查询/命令关联的方法。

 

 

 

TableAdapter 可以公开两类方法:适合用于填充现有 DataSet Fill 方法和返回已填充的 DataTable 对象的 Get 方法。前者更适合用于 Windows 客户端(其中 DataSet 在应用程序的生存期内保存在内存中),而后者(即 Get 方法)更适合用于 ObjectDataSourceTableAdapter 向导还能为所提供的 SQL 选择语句(需要选择主键)自动生成 UpdateInsert Delete 方法。在完成该向导之后,Visual Studio 将一个新的 DataTable TableAdapter 类型添加到 DataSet 设计器。

 

TableAdapter 表示单个结果集的架构以及该架构上的 SelectUpdateInsert Delete 操作。通过在 DataSet 设计器中右击,可以在 DataSet 中添加多个 TableAdapter。通过在设计器中右击 TableAdapter 框,还可以添加更多查询,条件是这些查询返回相同的架构(字段)。例如,您有单个 TableAdapter,它具有方法 GetAuthors() GetAuthorsById(int id),而您需要一个新的 TableAdapter 以便添加 GetTitles() 方法。下图演示添加了几个 TableAdapter DataSet 设计器:

 

 

在完成 DataSet 的设计之后,请保存 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。我们将在本教程后面几个其他示例中使用此 DataSet 演示如何使用 ASP.NET 数据控件来实现简单的相册应用程序。注意,此示例中的 DetailsView 使用一个名为 ImageField 的新字段类型来显示照片图像。另请注意,使用 ObjectDataSource ConvertNullToDBNull 会导致空参数值在传递到 TableAdapter 方法(必需)之前转换为 DbNull

 

 

 

VB Binding to a Visual Studio DataSet

posted @ 2006-04-16 07:49  启明星工作室  阅读(2412)  评论(0编辑  收藏  举报