前面使用的数据源都是 SqlDataSource,我们可以看到在页面中直接调用了 SQL 语句,也就是说将表现层和数据访问层是混在一起的,这不利于架构的清晰,所以我们使用 ObjectDataSource 将数据访问层独立出来。
使用 ObjectDataSource 不会影响 GridView 和 DetailsView 的代码,我们先添加一个 ObjectDataSource。
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
TypeName="Cftea.Demo.Doc"
EnablePaging="true"
SelectCountMethod="GetDocsCount"
SelectMethod="GetDocsList"
InsertMethod="InsertDoc"
UpdateMethod="ModifyDoc"
DeleteMethod="DeleteDoc">
</asp:ObjectDataSource>
- TypeName 指定一个类名,如果有名称空间,要加上名称空间。
- EnablePaging 表示是否需要分页。
- SelectCountMethod 表示类中选取总记录数的方法名称。
- SelectMethod 表示类中选取当前分页记录集的方法名称。
- InsertMethod 表示插入记录的方法名称。
- UpdateMethod 表示更新记录的方法名称。
- DeleteMethod 表示删除记录的方法名称。
现在我们就需要来简单说说这个类。
namespace Cftea.Demo
{
public static class Doc
{
public static int GetDocsCount()
{
string sql = @"select count(*) from cftea_docs";
//执行这个 sql,获得记录总数
return ...
}
public static DataView GetDocsList(int startRowIndex, int maximumRows)
{
//
}
public static void InsertDoc(string title, string content, int categoryId)
{
//
}
public static void ModifyDoc(int id, string title, string content, int categoryId)
{
//
}
public static void DeleteDoc(int id)
{
//
}
}
}
具体实现方法就不写了,请参见 ADO.NET 对象介绍连载文章。我们使用的是静态类,如果使用非静态类,也能正常运行,只是每次它会自动创建并销毁实例,和静态类相比,这要花费一点不必要的开销。
要说明的是 GetDocsList(int startRowIndex, int maximumRows),这里面有两个参数,如果 ObjectDataSource 的 EnablePaging 为 false,就应该去掉这两个参数。而如果要改变参数名称,就得在 ObjectDataSource 中,利用 StartRowIndexParameterName、MaximumRowsParameterName 指定你定义的参数名称。
- startRowIndex 当前页第一条记录的索引,其值为:页大小*(当前页数-1)。
- maximumRows 页大小,即一页的记录数,是设定的记录数,不是实际有多少记录(一般来说最后一页的记录数都小于设定的记录数)。
二者的值由 GridView 自动传过来,也就是说要先设定 GridView 为可以分页。利用二者可以只取当前页的记录,性能很高,速度也很快,这就解决了前面说的性能问题。关于此分页,请参考数据库分页连载。
更高级的方式请参见手工实现 RowCommand、RowDeleting、RowEditing、RowUpdating、RowCancelingEdit。
相关阅读