【问题标题】:How can I prevent duplication of the content in itemtamplate for the alternating template in repeater?如何防止重复器中交替模板的 itemtamplate 内容重复?
【发布时间】:2011-10-24 10:10:38
【问题描述】:

有没有办法防止 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>

【问题讨论】:

    标签: asp.net .net repeater itemtemplate code-duplication


    【解决方案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 事件上触发的代码,并使用 FindControl 以编程方式更改 css 类。

        我知道我更愿意使用哪个...

        【讨论】:

        • 实际上我很担心,因为对我来说,仅使用不同的 css 类来查看相同的块是没有意义的。应该有一种更简单的方法,只能通过编辑标记来处理......不是吗?
        • 在您的场景中,这只是一个简单的 CSS 更改。在其他情况下,附加控件、文本和 css 可能会有很大不同。如前所述,您正在按预期执行此操作,即使看起来很多信息都重复了。
        • @pencilCake 正如你所展示的,使用AlternatingTemplate 可能是一个快速的灾难,尤其是当模板变得更大并且仍然基本相同时。这严重违反了DRY。一种常见的解决方案是使用包装控件(然后您只需重复声明),另一种是在代码隐藏中使用ItemIndex。两者各有千秋,都避免了这样的危险陷阱。
        【解决方案4】:

        由于提议的解决方案似乎并不令人满意并且没有其他“.net”解决方案,我建议您在 javascript 中执行此操作(因为它在纯 CSS 中不存在)。

        jQuery 允许您在选择器的偶数和奇数元素上应用不同的样式。 它应该与表格行以外的其他元素一起使用...

        所以这样的事情应该可以工作:

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

        或者您可以将ItemTemplate 设置为所有元素并使用(它可能表现更好):

        $("#rptCommentHistory span:odd").removeClass("ItemTemplate").addClass("alternatingTtemTemplate");
        

        【讨论】:

          猜你喜欢
          • 2022-07-12
          • 1970-01-01
          • 1970-01-01
          • 2020-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多