在没有数据库的情况下在 ASP.NET 中进行分页

问题描述 投票:0回答:3

我的 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,因为我的服务器上有该版本。

谢谢。

asp.net pagination repeater
3个回答
4
投票

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 项。


3
投票

使用“跳过并采取”的想法,我将以下内容放在一起,这非常简单并且非常有效,谢谢:-)

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;
    }
}

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.