分页结果在asp.net中

时间:2012-07-22 16:32:21

标签: asp.net asp.net-mvc asp.net-ajax paging

我试图在asp.net中找到一个解决方案,以便实现数据分页 1)应用程序不必在每次页面索引更改时连接到DB,以便检索整个集合或仅查找一组分页结果 2)不希望将结果存储在Viewstate或Session

对于大型结果集,我考虑将键值(ID,rownumber)存储在结果集(数组,json)中,然后在行绑定上填充其他行信息。

有没有办法在asp.net中执行此操作,或者我需要考虑jQuery用于此场景。

3 个答案:

答案 0 :(得分:5)

  

1)应用程序不必在每次页面索引更改时连接到DB,以便检索整个集合或只是一组分页结果

您需要缓存结果。例如:

示例:

缓存方法1

    <asp:SqlDataSource runat="server" ID="sdsd"
        SelectCommand="select * from jobs"
        SelectCommandType="Text"
        DataSourceMode="DataSet"
        ConnectionString="<%$ConnectionStrings: PUBSConnectionString %>"
        CacheDuration="30"
        EnableCaching="true"
    >
    </asp:SqlDataSource>
    <asp:DropDownList ID="ddl" runat="server" AutoPostBack="true" DataSourceID="sdsd" DataTextField="job_desc" DataValueField="job_id">
    </asp:DropDownList>

缓存方法2

您始终可以将结果缓存在代码中:

protected void Page_Load(object sender, EventArgs e)
{
    if (!this.IsPostBack)
    {
        IEnumerable<employee> res = Enumerable.Empty<employee>();

        if (this.Cache["emp"] == null)
        {
            res = this.GetEmployeesFromDatabase();
            this.Cache["emp"] = res;
        }
        else
        {
            res = this.GetEmployeesFromCache();
        }

        this.grv.DataSource = res;
        this.grv.DataBind();
    }
}

protected IEnumerable<employee> GetEmployeesFromDatabase()
{
    // go to your database to get the objects
    return Enumerable.Empty<employee>();
}

protected IEnumerable<employee> GetEmployeesFromCache()
{
    return this.Cache["emp"] as IEnumerable<employee>;
}

请注意,返回的对象必须是DataSetDataTable,才能为缓存结果添加排序功能

  

2)不希望将结果存储在Viewstate或Session

您需要再次使用缓存

  

有没有办法在asp.net中执行此操作,或者我需要考虑jQuery用于此场景。

我不知道jQuery(本身)如何帮助你满足你的需求,我的意思是如果你使用AJAX帖子,你会提高当前页面的感知性能,但这对你的连接没有帮助除非你使用缓存

,否则到数据库

答案 1 :(得分:2)

我不确定它是否涵盖了您的所有要求,但是对其进行分页是PagedDataSource Class

封装允许其执行分页的数据绑定控件(如DataGrid,GridView,DetailsView和FormView)的与分页相关的属性。这个类不能被继承。

否则我建议您查看JqGrid

答案 2 :(得分:1)

对于分页数据集,您通常有两个选项:

  • 如果你期望一个小的结果集(即将搜索结果限制在500行或更少),那么使用viewstate是完全可以接受的。我个人更喜欢避免使用会话来存储请求级别数据

    • 如果您期望获得较大的结果集,那么您将需要一个分页数据源。您可以编写一个返回分页数据集的存储过程(即传递页面索引/页面大小)或使用任何ORM(ENTITY框架或LINQ TO SQL)。使用take(n)和skip(n)支持分页。

http://www.mssqltips.com/sqlservertip/1699/sql-server-stored-procedures-to-page-large-tables-or-queries/

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/sorting-filtering-and-paging-with-the-entity-framework-in-an-asp-net-mvc-application

无论您如何呈现数据(jQuery / ajax或服务器控件),您仍然必须一次性获取整个结果集并将其缓存以用于后续请求(json数组或视图状态),或者您需要数据源支持分页。如果您关注性能,那么分页数据源是可行的方法(EF示例也适用于webforms,只需使用事件处理程序而不是mvc中的action方法)。