2010-08-15 19 views
3

我在我的ASP.NET站點上有一個頁面,它有一個Repeater控件來顯示來自站點成員的帖子。在沒有數據庫的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的實例,這一切按預期工作,但我想要在添加更多帖子時添加分頁。

我發現的所有例子似乎都涉及讓數據在數據庫中分頁 - 是否有任何方法可以將轉發器或其他類似控件綁定到我的內存中的MemberPosts集合並讓它爲我實現分頁?

我使用VS2010/.NET 3.5,但可以切換到4.0,如果有必要,因爲我有我的服務器上。

謝謝。

+1

+1指出互聯網上的每個ASP .NET示例都將UI直接綁定到數據庫。我真的希望他們停止宣傳這樣的做法:) – David 2010-08-15 12:23:34

+0

這是CQRS用法的常見做法 – 2010-08-15 19:12:53

回答

4

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個項目的第二頁。

+0

我需要添加所有的支持,然後顯示一個新的頁面等使用querystrings和頁碼等? 我真的只是想讓ASP.NET爲我處理所有的分頁,並將我的數據放入某種格式,以便我可以對其進行分頁。 雖然如果我需要......我會沿着那條路線走下去...... – Michael 2010-08-15 12:36:34

+0

ASP.NET可能沒有任何分頁控制。 ASP.NET MVC沒有。當我研究它時,擴展方法的一個例子是一個輸出頁面HTML的方法,並且所有控制器都有隱式分頁。 – AlexanderMP 2010-08-15 12:39:49

+0

謝謝,拉出我的手指,並執行下面的代碼........ – Michael 2010-08-15 13:56:26

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

運作的,你可以使用綁定一個ObjectDataSource和實現分頁很容易出現!通過這種方式,您可以完全重用綁定控件邏輯.........

+0

任何鏈接請問如何使用中繼器和內存中的對象集合做到這一點? – Michael 2010-08-15 16:36:56

+0

中繼器是低層次的,並且沒有內置分頁支持,如果你想分頁開箱即用,你需要使用更高層次的控制... – 2010-08-15 16:43:52

+0

比如? 理想情況下輕巧的東西。 – Michael 2010-08-15 16:45:41

相關問題