Как я могу предотвратить дублирование содержимого в itemtamplate для альтернативного шаблона в повторителе? - PullRequest
4 голосов
/ 24 октября 2011

Есть ли способ предотвратить дублирование содержимого шаблона элемента, которое просто появится с другим классом 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>

Ответы [ 4 ]

4 голосов
/ 24 октября 2011

Это должно делать то, что вы хотите: -)

<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 голосов
/ 24 октября 2011

Я никогда не использую 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";
}
0 голосов
/ 24 октября 2011

Поскольку кажется, что предложенные решения не удовлетворяют требованиям и что нет другого решения ".net", я бы посоветовал вам сделать это в javascript (поскольку он не существует в чистом CSS).

jQuery позволяет применять другой стиль к элементам четности и коэффициентов селектора. Он должен работать с другими элементами, кроме строк таблицы ...

Так что-то вроде этого должно работать:

$("#rptCommentHistory span:even").addClass("itemTemplate");
$("#rptCommentHistory span:odd").addClass("alternatingTtemTemplate");

Или вы можете просто установить ItemTemplate для всех элементов и использовать (это может работать лучше):

$("#rptCommentHistory span:odd").removeClass("ItemTemplate").addClass("alternatingTtemTemplate");
0 голосов
/ 24 октября 2011

Это не совсем дублирование как таковое, не беспокойтесь об этом. Вы реализуете это в значительной степени, как задумано.

Единственная другая опция, о которой я могу подумать, это использовать шаблон элемента, написать некоторый код, который запускается в событии itemdatabound, и программно изменить класс css с помощью FindControl.

Я знаю, какой я бы лучше использовал ...

...