#asp.net #.net #repeater #itemtemplate #code-duplication
#asp.net #.net #repeater #itemtemplate #код-дублирование
Вопрос:
Есть ли способ предотвратить дублирование содержимого itemtemplate, которое просто появится с другим классом css для чередующегося шаблона блока?
<asp:Repeater ID="rptCommentHistory" runat="server">
<ItemTemplate>
<asp:Label ID="lblComment" runat="server" Text='<%#Eval("Comment").ToString() %>'
Class="itemTemplate"/>
</ItemTemplate>
<AlternatingItemTemplate>
<asp:Label ID="lblComment" runat="server" Text='<%#Eval("Comment").ToString() %>'
Class="alternatingTtemTemplate"/>
</AlternatingItemTemplate>
</asp:Repeater>
Ответ №1:
Это должно делать то, что вы хотите 🙂
<asp:Repeater ID="rptData" runat="server">
<ItemTemplate>
<asp:Label ID="lblData" runat="server" Text='<%# Eval("Comments") %>' CssClass='<%# Container.ItemIndex%2==0?"itemTemplate":"alternatingTtemTemplate" %>'></asp:Label>
</ItemTemplate>
</asp:Repeater>
Ответ №2:
Я никогда не использую AlternatingItemTemplate
. Мне не нравится дублировать свой код с целью создания чередующегося элемента, и я думаю, что если код настолько отличается, что его нельзя классифицировать как дубликат, тогда вам все равно не следует использовать Repeater
элемент управления.
Поэтому я всегда просто использую ItemTemplate
и вношу любые изменения, которые мне нужны в ItemDataBound
случае.
Чтобы определить, является ли элемент обычным или чередующимся элементом, я бы сделал что-то вроде:
if ((e.Item.ItemIndex 1 % 2)=0){
//Alternating code here..
}
В вашем случае единственным отличием является изменение Label
CssClass
, поэтому я бы сделал что-то вроде:
if ((e.Item.ItemIndex 1 % 2)=0){
Label lblComment = e.Item.FindControl("lblComment");
lblComment.CssClass = "alternatingTtemTemplate";
}
Ответ №3:
На самом деле это не дублирование как таковое, не беспокойтесь об этом. Вы реализуете это в значительной степени так, как задумано.
Единственным другим вариантом, который я могу придумать, было бы использовать itemtemplate , написать некоторый код, который запускается при событии itemdatabound, и программно изменить класс css с помощью FindControl .
Я знаю, что я предпочел бы использовать…
Комментарии:
1. На самом деле я беспокоюсь, так как мне не имеет смысла видеть один и тот же блок только с другим css-классом. Должен быть более простой способ, который может быть обработан только путем редактирования разметки… Не так ли?
2. В вашем сценарии это просто простое изменение CSS. В других случаях это может сильно отличаться от дополнительных элементов управления, текста и css. Как уже было сказано, вы реализуете это по назначению, даже если кажется, что большая часть информации дублируется.
3. Использование @
AlternatingTemplate
pencilCake может быть быстрым рецептом катастрофы, как вы показываете, особенно когда шаблоны становятся больше и по-прежнему в основном равны. Это сильное нарушение DRY . Одним из распространенных решений является использование элемента управления-оболочки (тогда вам нужно только повторить объявление), другое —ItemIndex
в коде. Оба имеют свои достоинства, оба избегают опасных ловушек, подобных этой.
Ответ №4:
Поскольку кажется, что предлагаемые решения не удовлетворяют и что нет другого решения «.net», я бы посоветовал вам сделать это на javascript (поскольку он не существует в чистом CSS).
jQuery позволяет применять другой стиль к элементам even и odds селектора. Он должен работать с другими элементами, кроме строк таблицы…
Так что что-то вроде этого должно работать :
$("#rptCommentHistory span:even").addClass("itemTemplate");
$("#rptCommentHistory span:odd").addClass("alternatingTtemTemplate");
Или вы можете просто установить ItemTemplate
для всех элементов и использовать (это может работать лучше) :
$("#rptCommentHistory span:odd").removeClass("ItemTemplate").addClass("alternatingTtemTemplate");