我似乎无法弄清楚这组代码有什么问题。我有我的前端:
<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所以这个东西正在抛出我似乎无法调试的错误。
答案 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。