repetidores anidados con listas de cadenas y objetos

Parece que no puedo averiguar qué está mal con este conjunto de código. Tengo mi front-end:

<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>

Entonces tengo mi código detrás:

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

Estoy tratando de hacer que el repetidor más externo repita los años que se encuentran en el conjunto de datos principal de "BlogPost". Luego, en el repetidor interno, estoy tratando de escribir cada publicación que corresponda a ese año. Estoy usando sharepoint, así que esto arroja errores que parece que no puedo depurar.

preguntado el 30 de agosto de 11 a las 23:08

-1, ¿Qué errores está lanzando? ¿Dónde está lanzando errores? -

1 Respuestas

Su principal problema es que no tiene la sintaxis de enlace de datos adecuada en su código aspx. Debería ser:

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

Además, en su primera llamada de enlace de datos, puede hacer lo siguiente porque es una lista de cadenas:

<%# Container.DataItem %>

Más allá de eso, hay algunos otros problemas con su lógica en el evento ItemDatabound. Está llamando a los mismos GetArchiveItems para cada año. Lo que significa que obtendrá su lista completa de ArchiveItems para cada año. Debería recuperar el año enlazado actualmente y pasarlo a su función GetArchiveItems para que pueda recuperar solo aquellos que están relacionados con ese año.

Además, no necesita inicializar su variable ArchivePostRepeater en un nuevo objeto Repeater (), porque lo está configurando en otro en el código inmediatamente después de eso. Puede configurarlo como nulo inicialmente.

Respondido 31 ago 11, 09:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.