ASP.NET Ripetitore di Modello, il Codice Condizionale per ogni n-Esimo elemento

Sto usando un asp.net ripetitore di creare un gruppo di immagini. L’immagine di markup è lo stesso modo standard <ItemTemplate> è bene.

Tuttavia, voglio avvolgere K immagini in un div. Diciamo che mi legano 25+ immagini dal ripetitore e voglio 5 immagini al div. Come posso fare in modo condizionale creando l’inizio e il tag di chiusura per il div?

È questo un caso più adatte per un ciclo for.

  • È possibile ottenere che utilizzando i concetti mostrato di seguito, è solo bisogno di modificarlo per soddisfare i vostri scopi. StackOverflow gli utenti non sono qui per scrivere “teh codez’ per voi, siamo qui per aiutarci a vicenda imparare. Mostrare il codice che hai scritto/provato e ci può aiutare a ordinare.
  • Yup, a chiarire la questione
InformationsquelleAutor ckarbass | 2009-02-18

 

4 Replies
  1. 23

    Questo dovrebbe funzionare per voi, non per nulla nel codice dietro (diversamente dall’associazione il ripetitore..):

    <asp:Repeater ID="repImages" runat="server">
    <HeaderTemplate><div></HeaderTemplate>
    
    <ItemTemplate>
    <%# (Container.ItemIndex != 0 && Container.ItemIndex % 5 == 0) ? @"</div><div>" : string.Empty %>
    <asp:Image ID="imgGallery" runat="server" ImageUrl='<%# /* your code  here */%>' />
    </ItemTemplate>
    
    <FooterTemplate></div></FooterTemplate>
    </asp:Repeater>
    • Qualcuno sa come posso utilizzare un normale ‘se’ istruzione nella mia risposta, invece, l’operatore ternario (a perdere la stringa vuota alla fine)?
    • Non è possibile, se la dichiarazione non è un’espressione (non restituiscono un valore), quindi non può essere utilizzato in associazione di dati sintassi.
    • Ho pensato che era il caso, grazie per la spiegazione
    • Come può l’ID di ogni immagine diventa unico ??? anzi, voglio ID dell’immagine come immagine1 , immagine2, image3 . . . utilizzando itemIndex. Ma ItemIndex non è permesso di essere utilizzato nel tag asp (runat=”server”). Qualcuno può aiutarmi?
  2. 10

    Qui è dove Asp.Net WebForms può dare incredibile RAD efficienza.
    È possibile utilizzare il controllo ListView, e impostare il numero di elementi per “gruppo”, che consentirà di impostare il codice HTML che circonda un gruppo, così come ogni singolo elemento. In questo modo si può racchiudere il gruppo con i tag condizionali.

    <asp:ListView ID="ListView1" runat="server" DataKeyNames="id" DataSourceID="LinqDataSource1" GroupItemCount="3">
    <LayoutTemplate>
        <div id="layout">
            <asp:PlaceHolder ID="groupPlaceholder" runat="server"></asp:PlaceHolder>
        </div>
    </LayoutTemplate>
    <GroupTemplate>
        <div class="group">
            <asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder>
        </div>
    </GroupTemplate>
    <EmptyDataTemplate>
        <span>No data was returned.</span>
    </EmptyDataTemplate>
    <ItemTemplate>
        <div class="item">
            <img alt='<%# Eval("title") %>' title='<%# Eval("title") %>'
                src='<%# Eval("filename","photos/{0}") %>' />
        </div>
    </ItemTemplate>
    </asp:ListView>
  3. 3

    Se si desidera mantenere il vostro markup della pagina ASPX che si potrebbe provare anche questa variante di David metodo:

    Nella pagina aspx:

    <ItemTemplate>
    <asp:Literal runat="server" ID="divStart" Text="<div>" />
    <asp:Image ....>
    <asp:Literal runat="server" ID="divEnd" Text="</div>" />
    </ItemTemplate>

    Nell’evento ItemDataBound nel codebehind:

    e.Item.FindControl("divStart").Visible
        = e.Item.FindControl("divEnd").Visible 
        = e.Item.ItemIndex % 5 == 0;
    • Yep, mantenendo il markup della pagina è un ottimo Jorge. Probabilmente più leggibile rispetto alla mia versione 😉
    • Buon uso del letterale tag. Sembra che troppe persone utilizzare le etichette per scrivere markup della pagina, quando il controllo letterale, ma senza la <span> tag che vengono generati con l’etichetta di controlli.
  4. 2

    Aggiungere due etichette vuote controlli nel tuo Ripetitori ItemTemplate in cui si chiede al tag div per essere.

    Quindi aggiungere un evento ItemDataBound del Ripetitore.

    Poi inserisci questo codice nell’evento ItemDataBound:

        Protected Sub Repeater1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs)
        If (e.Item.ItemType = ListItemType.Item) Or (e.Item.ItemType = ListItemType.AlternatingItem) Then
            If e.Item.ItemIndex Mod 5 = 0 Then
                Dim lblDivStart As Label = CType(e.Item.FindControl("lblDivStart"), Label)
                Dim lblDivEnd As Label = CType(e.Item.FindControl("lblDivEnd"), Label)
                lblDivStart.text = "<div>"
                lblDivEnd.text = "</div>"
            End If
        End If
    End Sub

    Nota – Questo avrà bisogno di qualche ritocco per gestire il primo div e potrebbe essere necessario fare qualcosa di simile Se (e.Voce.ItemIndex + 1) Mod 5 = 0 per ottenere il div per mostrare esattamente dove si desidera.

    Per ulteriori informazioni:

    DataListItem.ItemIndex Proprietà

    DataList.Evento ItemDataBound

    • Interrompere l’ .NET follia! In php questa sarebbe una semplice condizione all’interno di un foreach nel modello. Comunque, +1 per la soluzione.
    • HaHa. Giusto Rick. Sono sicuro che c’è un modo più intelligente per fare questo .NET, sto solo abbastanza intelligente per sapere ; )
    • Il modo più efficace per fare questo .NET è quello di passare a ASP.NET MVC
    • Il modo più efficace è quello di utilizzare ListView

Lascia un commento