带有字符串和对象列表的嵌套转发器

时间:2011-08-30 23:09:46

标签: c# asp.net sharepoint

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

<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所以这个东西正在抛出我似乎无法调试的错误。

2 个答案:

答案 0 :(得分:0)

您应该拥有<HeaderTemplate><FooterTemplate>标记来处理打开/关闭的ul标记,

例如,请查看我的回复:How to add/read items in ASP.NET

答案 1 :(得分:0)

您的主要问题是您的aspx代码中没有正确的数据绑定语法。它应该是:

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

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

<%# Container.DataItem %>

除此之外,ItemDatabound事件中的逻辑还存在一些其他问题。您每年都在调用相同的GetArchiveItems。这意味着您将获得每年的整个ArchiveItem列表。您应该检索当前绑定的年份并将其传递给您的GetArchiveItems函数,以便您只能检索与该年相关的年份。

此外,您不需要将ArchivePostRepeater变量初始化为新的Repeater()对象,因为您之后会立即将其设置为代码中的另一个。你最初可以将它设置为null。