代码之家  ›  专栏  ›  技术社区  ›  Mike

寻呼ASP.NET 没有数据库

  •  3
  • Mike  · 技术社区  · 15 年前

    我的电脑上有一页ASP.NET 具有转发器控件以显示来自站点成员的帖子的站点。

    目前,我正在将文章的数据存储在一个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的实例,并且一切都按预期工作,但是我想在添加更多post时添加分页。

    我发现的所有示例似乎都涉及到在数据库中分页数据—有没有任何方法可以将中继器或其他类似控件绑定到内存中的MemberPosts集合,并让它为我实现分页?

    我使用的是VS2010/.net3.5,但是如果需要的话可以切换到4.0,因为我的服务器上有这个版本。

    谢谢。

    3 回复  |  直到 15 年前
        1
  •  4
  •   Alex    15 年前
        2
  •  3
  •   Mike    15 年前

    我运用了“跳过并取”的思想,把以下内容组合起来,非常简单,非常有用,谢谢:-)

    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
  •  0
  •   Tim Mahy    15 年前

    您可以使用objectdatasource绑定并在那里很容易地实现分页!这样您就可以完全重用可绑定控件逻辑。。。。。。。。。

    推荐文章