2011-08-30 95 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()对象,因为您在此之后立即将其设置为代码中的另一个。您可以将其初始设置为空。