我似乎不能弄清楚这组代码有什么问题。我有我的前端:
<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()对象,因为您在其后的代码中将它设置为另一个对象。