如果语句在转发器ItemTemplate中

Viv*_*ndi 10 c# asp.net repeater itemtemplate

我正在使用ASP.NET Repeater来显示一个内容<table>.它看起来像这样:

<table cellpadding="0" cellspacing="0">
    <asp:Repeater ID="checkboxList" runat="server" OnItemDataBound="OnCheckboxListItemBound">
        <ItemTemplate>
            <tr id="itemRow" runat="server">
                <td>
                    Some data
                </td>
            </tr>
        </ItemTemplate>
    </asp:Repeater>
</table>
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我想if()在里面有一个声明,ItemTemplate所以我可以有条件地确定我是否要打印出一个<tr>标签.

所以我想要这样的东西:

<table cellpadding="0" cellspacing="0">
    <asp:Repeater ID="checkboxList" runat="server" OnItemDataBound="OnCheckboxListItemBound">
        <ItemTemplate>

            <% if ( (CurrentItemCount % 2) == 0 ) { %?>
            <tr id="itemRow" runat="server">
            <% } %>
                <td>
                    Some data
                </td>
            <% if ( (CurrentItemCount % 2) == 0 ) { %?>
            </tr>
            <% } %>
        </ItemTemplate>
    </asp:Repeater>
</table>
Run Code Online (Sandbox Code Playgroud)

有什么办法可以达到这个目的吗?

PS.在CurrentItemCount刚刚组成.我还需要一种方法来获取该if()语句中的当前项目计数.但我似乎只能从中得到它<%# Container.ItemIndex; %>,这不能与if()声明一起使用?

mae*_*ets 18

另一种方法(如果性能不是问题):

<ItemTemplate>
  <!-- "If"  -->
  <asp:PlaceHolder runat="server" Visible="<%# MyCondition %>">
    <tr><td></td></tr>
  </asp:PlaceHolder>  
  <!-- "Else" -->
  <asp:PlaceHolder runat="server" Visible="<%# !MyCondition %>">
    <tr><td></td></tr>
  </asp:PlaceHolder>
</ItemTemplate>
Run Code Online (Sandbox Code Playgroud)

  • 是的,但我认为在可见性条件不是静态的情况下(在数据绑定时确定),两个占位符中定义的所有逻辑都将在服务器上进行评估/执行.可能导致性能下降但不一定. (2认同)

Cla*_*edi 16

如果你正在尝试制作一个2列表,这可以解决问题

<%# Container.ItemIndex % 2 == 0 ? "<tr class='itemRow'>" : "" %>
    <td>
       Some data
    </td>
<%# Container.ItemIndex % 2 != 0 ? "</tr> : "" %>
Run Code Online (Sandbox Code Playgroud)

改变了一些事情:id="itemRow"因为所有行都会导致重复的id不允许.

删除runat="server"因为在这种情况下没有意义.


Tim*_*ter -1

我会使用代码隐藏:

protected void OnCheckboxListItemBound(Object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        HtmlTableRow itemRow = (HtmlTableRow) e.Item.FindControl("itemRow");
        itemRow.Visible = e.Item.ItemIndex % 2 == 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 此答案不显示如何在 ItemTemplate 中使用 if 语句。它实际上应该只是一个评论。 (11认同)
  • 可以说它的可读性和可维护性较差。ASP.NET 的标准方法是在标记中包含 UI 逻辑,在 C# 文件中包含业务逻辑。将 UI 逻辑放入 C# 文件中几乎与 ASP 和 PHP 将业务逻辑代码放入标记中一样糟糕。这是我发现实际上正确执行此操作的示例之一:http://stackoverflow.com/a/264445/556649 (2认同)