Шаблон ретранслятора ASP.NET, условный код для каждого N-го элемента
Я использую ретранслятор asp.net для создания кучи изображений. Разметка изображения такая же, что и стандартный <ItemTemplate>
.
Однако, я хочу обернуть K изображений в div. Допустим, я связываю 25+ изображений с ретранслятором, и мне нужно 5 изображений на div. Как мне условно создать теги start и close для div?
Этот случай лучше подходит для цикла for.
Ответы
Ответ 1
Это должно работать для вас, без необходимости чего-либо в коде (кроме привязки ретранслятора..):
<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>
Ответ 2
Вот где Asp.Net WebForms может дать вам невероятную эффективность RAD.
Вы можете использовать новый элемент управления ListView и задать количество элементов на "группу", что позволит вам настроить HTML, который окружает группу, а также каждый отдельный элемент. Таким образом, вы можете окружить группу условными тегами.
<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
Если вы хотите сохранить свою разметку на странице ASPX, вы также можете попробовать этот вариант метода Дэвида:
На странице aspx:
<ItemTemplate>
<asp:Literal runat="server" ID="divStart" Text="<div>" />
<asp:Image ....>
<asp:Literal runat="server" ID="divEnd" Text="</div>" />
</ItemTemplate>
В событии ItemDataBound в коде:
e.Item.FindControl("divStart").Visible
= e.Item.FindControl("divEnd").Visible
= e.Item.ItemIndex % 5 == 0;
Ответ 4
Добавьте два пустых элемента управления метками в свой ItemTemplate Repeaters, где вам нужны теги div.
Затем добавьте событие ItemDataBound в Repeater.
Затем добавьте этот код в событие 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
Примечание. Это потребует некоторой настройки для обработки первого div, и вам может понадобиться сделать что-то вроде If (e.Item.ItemIndex + 1) Mod 5 = 0, чтобы заставить divs отображаться именно там, где вы хотите.
Для получения дополнительной информации:
Свойство DataListItem.ItemIndex
Событие DataList.ItemDataBound