【问题标题】:Paging in ASP.NET without a database没有数据库的 ASP.NET 中的分页
【发布时间】:2010-08-16 03:24:29
【问题描述】:

我的 ASP.NET 网站上有一个页面,该页面有一个 Repeater 控件来显示来自该网站成员的帖子。

目前,我将帖子的数据存储在 XML 文件中,然后将其缓存在自定义对象中的站点内。

所以我有:

public class MemberPost
{
    public string Title { get; set; }
    public string Text { get; set; }
    public string Name { get; set; }
    public DateTime Date { get; set; }
    public List<string> Pictures { get; set; }
}

还有:

public class MemberPosts : List<MemberPost>
{

}

我可以将转发器的数据源设置为 MemberPosts 的一个实例,这一切都按预期工作,但我想在添加更多帖子时添加分页。

我发现的所有示例似乎都涉及在数据库中对数据进行分页 - 有什么方法可以将转发器或其他类似控件绑定到我的内存中 MemberPosts 集合并让它为我实现分页?

我正在使用 VS2010 / .NET 3.5,但如果需要,我可以切换到 4.0,因为我的服务器上有。

谢谢。

【问题讨论】:

  • +1 指出互联网上的每个 ASP .NET 示例都将 UI 直接绑定到 DB。我真的希望他们停止推广这种做法:)
  • 这是 CQRS 使用的常见做法

标签: asp.net repeater paging


【解决方案1】:

http://msdn.microsoft.com/en-us/library/bb358985.aspx

http://msdn.microsoft.com/en-us/library/bb503062.aspx

这些是您需要的 IEnumerable 中的 2 个方法。

你有

yourList.Skip(5).Take(5)

显示 5 个项目的第二页。

【讨论】:

  • 我需要添加所有支持然后使用查询字符串和页码等显示新页面等吗?我真的只想让 ASP.NET 为我处理所有分页,并将我的数据放入某种允许我分页的格式。如果我需要的话,我会沿着那条路走……
  • ASP.NET 可能没有任何分页控件。 ASP.NET MVC 没有。在我研究的时候,扩展方法的一个例子是输出页面HTML的方法,所有控制器都有隐式分页。
【解决方案2】:

使用 Skip and Take 的想法,我将以下内容放在一起,这很容易,而且非常感谢 :-)

protected void Page_Load(object sender, EventArgs e)
{
    IEnumerable<MemberPost> posts = from post in MemberPostCacher.Instance.Posts
                                    orderby post.Date descending
                                    select post;

    memberPostsRepeater.DataSource = GetPageMemberPosts(posts);
    memberPostsRepeater.DataBind();
}

private IEnumerable<MemberPost> GetPageMemberPosts(IEnumerable<MemberPost> posts)
{
    int totalNumberOfPosts = posts.Count();
    int pageSize = int.Parse(ConfigurationManager.AppSettings["MemberPostsPageSize"]);
    int totalPages = GetTotalPages(totalNumberOfPosts, pageSize);
    int currentPage = 1;

    if (Request.QueryString["page"] != null)
    {
        int.TryParse(Request.QueryString["page"], out currentPage);
        if (currentPage < 1 || currentPage > totalPages)
        {
            currentPage = 1;
        }
    }

    SetIntroVisibility(currentPage);
    SetLinks(currentPage, totalPages);
    SetPageNumberText(currentPage, totalPages);

    return posts.Skip((currentPage - 1) * pageSize).Take(pageSize);
}

private int GetTotalPages(int numberOfPosts, int pageSize)
{
    return numberOfPosts % pageSize == 0
                ? numberOfPosts / pageSize
                : numberOfPosts / pageSize + 1;
}

private void SetIntroVisibility(int currentPage)
{
    membersIntro.Visible = currentPage == 1;
}

private void SetLinks(int currentPage, int totalPages)
{
    linkPrevious.Visible = currentPage != 1;
    linkNext.Visible = currentPage != totalPages;

    linkPrevious.NavigateUrl = FormatPageLink(currentPage - 1);
    linkNext.NavigateUrl = FormatPageLink(currentPage + 1);
}

private string FormatPageLink(int pageNumber)
{
    return string.Format("{0}{1}{2}",
                            Request.CurrentExecutionFilePath,
                            "?page=",
                            pageNumber);
}

private void SetPageNumberText(int currentPage, int totalPages)
{
    lblNumRecords.Text = string.Format("&nbsp;&nbsp;Page {0} of {1}&nbsp;&nbsp;", currentPage, totalPages);
    if(totalPages == 1)
    {
        lblNumRecords.Visible = false;
    }
}

【讨论】:

    【解决方案3】:

    您可以使用对象数据源进行绑定并在那里非常轻松地实现分页!这样你就可以完全重用可绑定的控件逻辑............

    【讨论】:

    • 请提供有关如何使用中继器和内存中对象集合执行此操作的链接?
    • repeater 是低级的,没有内置的分页支持,如果你想要开箱即用的分页,你需要使用更高级别的控件...
    • 比如?理想的轻量级产品。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    相关资源
    最近更新 更多