中继器的分页支持

时间:2010-07-15 05:23:52

标签: asp.net pagination repeater

当我尝试在Repeater中使用分页支持时,PagedDataSource救了我。我提出了以下方法,并希望与大家分享是否存在任何陷阱,或者是否有任何改进的机会。

在这里,

/// <summary>
/// Create pagination for Repeater
/// </summary>
/// <param name="context">HttpContext</param>
/// <param name="obj">System.Collections.IEnumerable</param>
/// <param name="rptr">Repeater Control</param>
/// <param name="pgSize">How many records in each page</param>
/// <returns>Pagination String</returns>
public static String pagination(HttpContext context,Object obj,Repeater rptr ,int pgSize )
{
    String rtn = String.Empty;

    int curpage = 0;

    PagedDataSource pds = new PagedDataSource();
    pds.DataSource=(System.Collections.IEnumerable)obj;
    pds.AllowPaging = true;
    pds.PageSize = pgSize;

    if (context.Request.QueryString["page"] != null)
    {
        curpage = Convert.ToInt32(context.Request.QueryString["page"]);
    }
    else
    {
        curpage = 1;
    }

    pds.CurrentPageIndex = curpage - 1;

    if (!pds.IsFirstPage)
    {
        rtn = "<a href='?page=" + (curpage - 1).ToString() + "'>Prev</a>&nbsp;";
    }

    if (curpage == 1 && pds.DataSourceCount > pds.PageSize)
        rtn = "1";
    else if (pds.DataSourceCount == 0)
        rtn = "No data to display";
    else if (curpage > 1 && pds.DataSourceCount > pds.PageSize)
        rtn = rtn + "<a href='?page=1'>1</a>&nbsp;";

    for (int i = 2; i <= pds.PageCount; i++)
    {
        if (i == curpage)
            rtn = rtn + "&nbsp;" + i.ToString();
        else
            rtn = rtn + "&nbsp;<a href='?page=" + i.ToString() + "'>" + i.ToString() + "</a>";
    }

    if (!pds.IsLastPage)
    {
        rtn += "&nbsp;<a href='?page=" + (curpage + 1).ToString() + ">Next</a>";
    }

    rptr.DataSource = pds;
    rptr.DataBind();

    return rtn;
}

1 个答案:

答案 0 :(得分:1)

我可以看到一些最佳实践,但你的结构非常合理。但是,我可以建议如下:

1)我会建议代码保护。

2)内联格式化(使用+运算符构建字符串)比String.Format()方法更昂贵。

3)永远不要使用Convert.ToInt32(),因为它可能导致代码保释。请使用Int32.TryParse(),因为它更安全。

4)此外,您可能需要查看网址路由或网址重写的概念,以使您的网址更加友好。