具有字符串和对象列表的嵌套中继器

本文关键字:嵌套 中继器 列表 对象 字符串 | 更新日期: 2023-09-27 18:07:00

我似乎不能弄清楚这组代码有什么问题。我有我的前端:

<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();
            }
        }

我试图使最外层的重复器重复在"BlogPost"的主数据集中发现的年份。然后,我试着把那一年的每一篇文章都写下来。我正在使用sharepoint,所以这个东西抛出错误,我似乎无法调试。

具有字符串和对象列表的嵌套中继器

你的主要问题是你没有适当的数据绑定语法在你的aspx代码。应该是:

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

同样,在您的第一个数据绑定调用中,您可以执行以下操作,因为它是字符串列表:

<%# Container.DataItem %>
除此之外,ItemDatabound事件中的逻辑还存在一些其他问题。您每年都调用相同的GetArchiveItems。这意味着您将获得每年存档项目的完整列表。您应该检索当前绑定的年份并将其传递给GetArchiveItems函数,以便您可以仅检索与该年份相关的年份。

同样,您不需要将您的ArchivePostRepeater变量初始化为一个新的Repeater()对象,因为您在其后的代码中将它设置为另一个对象。