2011-08-30 97 views
0

我似乎無法弄清楚這組代碼有什麼問題。我有我的前端:帶有字符串和對象列表的嵌套中繼器

<asp:Repeater ID="ArchiveYearRepeater" runat="server" OnItemDataBound="ArchiveYearRepeater_ItemDataBound"> 

    <ItemTemplate> 
     <div class="ArchiveYear"> 
      <h3><% DataBinder.Eval(Container.DataItem); %></h3> 
      <ul> 
       <asp:Repeater ID="ArchivePostRepeater" runat="server"> 
        <ItemTemplate> 
         <li><a href="<% DataBinder.Eval(Container.DataItem, "URL"); %>"><% DataBinder.Eval(Container.DataItem, "Title"); %></a></li> 
        </ItemTemplate> 
       </asp:Repeater> 
      </ul> 
     </div> 
    </ItemTemplate> 

</asp:Repeater> 

然後,我有我的代碼背後:

protected void Page_Load(object sender, EventArgs e) 
     { 


      ArchiveYearRepeater.DataSource = GetYears(); 
      ArchiveYearRepeater.DataBind(); 

     } 
     protected List<ArchiveItem> GetArchiveItems() 
     { 
      List<ArchiveItem> ArchiveItems = new List<ArchiveItem>(); 
      List<BlogPost> posts = BlogPostManager.GetBlogPosts(0, BlogPostManager.BlogSection()); 

      foreach (BlogPost post in posts) 
      { 
       ArchiveItem archiveRecord = new ArchiveItem(); 
       archiveRecord.Title = post.Title; 
       archiveRecord.Link = post.URL; 
       archiveRecord.Date = post.Date; 
       archiveRecord.Year = post.Date.ToString("yyyy"); 
       ArchiveItems.Add(archiveRecord); 
      } 

      return ArchiveItems; 
     } 
     protected List<string> GetYears() 
     { 
      List<string> Years = new List<string>(); 
      List<ArchiveItem> ArchiveItems = new List<ArchiveItem>(); 
      ArchiveItems = GetArchiveItems(); 
      foreach (ArchiveItem item in ArchiveItems) 
      { 
       if(!Years.Contains(item.Year)){ 
        Years.Add(item.Year); 
       } 
      } 

      return Years; 
     } 
     private void ArchiveYearRepeater_ItemDataBound(object sender, 
    System.Web.UI.WebControls.RepeaterItemEventArgs e) 
     { 
      RepeaterItem item = e.Item; 
      if ((item.ItemType == ListItemType.Item) || 
       (item.ItemType == ListItemType.AlternatingItem)) 
      { 
       Repeater ArchivePostRepeater = new Repeater(); 
       ArchivePostRepeater = (Repeater)item.FindControl("ArchivePostRepeater"); 

       ArchivePostRepeater.DataSource = GetArchiveItems(); 
       ArchivePostRepeater.DataBind(); 
      } 
     } 

我努力使最外層的中繼器重複在博客帖子的「主數據集發現歲月」。然後,我試圖寫出當年的每一篇文章。我正在使用SharePoint,所以這件事是拋出錯誤,我似乎不能調試。

+0

-1,它拋出了什麼錯誤?它在哪裏拋出錯誤? –

回答

0

你的主要問題是,你沒有在正確的數據綁定語法你的aspx代碼。它應該是:

<%# DataBinder.Eval(Container.DataItem, "URL") %> 

而且,在你第一次綁定電話,你可以做以下的,因爲它是一個字符串列表:

<%# Container.DataItem %> 

除此之外,還有用你的邏輯一些其他問題在ItemDatabound事件中。您每年都調用相同的GetArchiveItems。這意味着您每年都會得到您的整個ArchiveItems列表。您應該檢索當前綁定的年份並將其傳遞給您的GetArchiveItems函數,以便您只能檢索那些與該年相關的年份。

此外,您不需要將ArchivePostRepeater變量初始化爲新的Repeater()對象,因爲您在此之後立即將其設置爲代碼中的另一個。您可以將其初始設置爲空。