Пейджинг в ASP.NET без базы данных - PullRequest
3 голосов
/ 15 августа 2010

У меня есть страница на моем сайте 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 в памяти, чтобы он реализовал для меня пейджинг?необходимо, поскольку у меня есть это на моем сервере.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 15 августа 2010

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

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

это те 2 метода в IEnumerable, которые вам нужны.

Вы получили

yourList.Skip(5).Take(5)

для отображения второй страницы из 5 элементов.

3 голосов
/ 15 августа 2010

Используя идею «Пропустить и взять», я собрал следующее, и это было довольно легко и доставляет удовольствие, спасибо: -)

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 голосов
/ 15 августа 2010

Вы можете связать с использованием objectdatasource и очень легко реализовать пейджинг! таким образом, вы можете полностью использовать логику привязываемых элементов управления .........

...