вложенные повторители со списками строк и объектов - PullRequest
0 голосов
/ 31 августа 2011

Я не могу понять, что не так с этим набором кода. У меня есть мой передний конец:

<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 голосов
/ 31 августа 2011

Ваша основная проблема заключается в том, что в вашем коде aspx отсутствует правильный синтаксис привязки данных. Должно быть:

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

Кроме того, при первом вызове привязки данных вы можете сделать следующее, потому что это список строк:

<%# Container.DataItem %>

Помимо этого, есть несколько других проблем с вашей логикой в ​​событии ItemDatabound. Вы вызываете одни и те же GetArchiveItems для каждого года. Это означает, что вы будете получать весь список ArchiveItems за каждый год. Вы должны извлечь текущий привязанный год и передать его в функцию GetArchiveItems, чтобы вы могли извлечь только те, которые относятся к этому году.

Кроме того, вам не нужно инициализировать переменную ArchivePostRepeater новым объектом Repeater (), поскольку вы устанавливаете его в другом коде сразу после этого. Вы можете просто установить его на ноль изначально.

0 голосов
/ 31 августа 2011

Вы должны иметь теги <HeaderTemplate> и <FooterTemplate> для обработки тегов открытия / закрытия ul,

Например, посмотрите мой ответ здесь: Как добавлять / читать элементы в ASP.NET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...