Как я могу предотвратить дублирование содержимого в itemtamplate для чередующегося шаблона в repeater?

#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");