Bruke repeater i stedet for er:query

Dersom en bruker UserControl i stedet for eRedaktør tagger kan det være en må skrive om tidligere løsninger. Her er et par tips for å skrive om en er:query til asp:repeater.

Bilder

Her er et Example på en repeater som lister ut bilder i et galleri. For å velge hvilket galleri som skal vises brukes intSortField1 til å lagre CategoryId til bildemappen.

        <asp:repeater ID="rptGallery" runat="server">
        <ItemTemplate>
            <section class='gallery-item'>
                <img src='<%# Eval("FileUrl") %>?fw=214&amp;fh=130' alt='' />
            </section>
        </ItemTemplate>
        </asp:repeater>

Koden som henter ut innholdet til denne ser i dette tilfellet slik ut:

        var gallery = from i in db.UploadedFiles
                      where i.Type == "image" &&
                      i.CategoryId == CurrentItem.intSortField1 &&
                      i.IsDeleted == false
                      orderby i.ItemOrder, i.Name
                      select new { FileUrl = i.FileUrl, ItemOrder = i.ItemOrder, Name = i.Name, Description = i.Description };

        rptGallery.DataSource = gallery;
        rptGallery.DataBind();

Tekst

Her er et Example som henter ut de 10 siste teksten fra feltsettet "tekst".

aspx:

    <asp:Repeater ID="rptItemList" runat="server">
    <ItemTemplate>
    <div>
    <h2><a href="<%# Eval("ItemUrl") %>"><%# Eval("Title") %></a></h2>
    <p><%# Eval("Teaser") %></p>
    </div>
    </ItemTemplate>
    </asp:Repeater>

aspx.cs:

        var itemList = (from i in db.Items
                        where i.IsDeleted == false
                        && i.IsPublished == true
                        && i.PublishDate <= DateTime.Now
                        && i.Template == db.Templates.FirstOrDefault(t => t.TemplateName == "tekst")
                        orderby i.PublishDate descending
                        select i).Take(10);

        rptItemList.DataSource = itemList;
        rptItemList.DataBind();

ifcount:

Men så er det designet slik at hvert fjerde bilde skal ha en egen klasse for å markere at det er siste på en linje. I er:query kan en bruke ifcount:mod4 for å gjøre dette. For å gjøre tilsvarende i en asp:repeater, kan en skrive:

<%# ((Container.ItemIndex + 1) % 4 == 0) ? @"layout-last" : string.Empty%>

Denne skriver ut "layout-last" på hvert fjerde bilde, og en tom streng på de andre. Dersom du ønsker å skrive ut noe annet på de tre foregående, kan du bytte ut string.Empty med f.eks. "layout-normal".