C# 如何在中继器中执行if语句

C# 如何在中继器中执行if语句,c#,repeater,if-statement,C#,Repeater,If Statement,快把我逼疯了 我需要做 <ItemTemplate> <% if (Container.DataItem("property") == "test") {%> I show this HTML <% } else { %> I show this other HTML <% } %> </ItemTemplate> 我显示这个HTML 我显示另一个HTML 但我一辈子都找不到

快把我逼疯了

我需要做

<ItemTemplate>
    <% if (Container.DataItem("property") == "test") {%>
        I show this HTML
    <% } else { %>
        I show this other HTML
    <% } %>
</ItemTemplate>

我显示这个HTML
我显示另一个HTML
但我一辈子都找不到任何方法来实现这一点。三元组不是很好,因为HTML的数量相当大,通过DataBind事件设置标签也不是很好,因为我必须在代码中包含大量HTML


当然有一种方法可以做到这一点。…

您可以尝试创建一种ViewModel类,对您的代码进行决策,然后对中继器感到满意,只需显示所提供的数据


这是一种将逻辑与UI分离的方法。然后,您可以拥有一个简单显示数据的哑用户界面,而无需决定显示什么/如何显示。

您可以通过用户控件实现这一点:

<ItemTemplate>
    <uc:Content1 runat='server' id='content1' visible='<%# Container.DataItem("property") == "test" %>'/>
    <uc:Content2 runat='server' id='content2' visible='<%# Container.DataItem("property") != "test" %>'/>
</ItemTemplate>

看起来我把它和实际的数据绑定搞混了

你可以这样做:

<asp:Repeater runat="server"> 
    <ItemTemplate>    
        <% if (((Product)Container.DataItem).Enabled) { %>
        buy it now!
        <% } else {%>
        come back later!
        <% } %>
    </ItemTemplate>
</asp:Repeater>

现在就买!
晚点再来!

您可以使用服务器端可见性:

<ItemTemplate>
    <div runat="server" visible='<% (Container.DataItem("property") == "test") %>'>
        I show this HTML
    </div>
    <div runat="server" visible='<% (Container.DataItem("property") != "test") %>'>
        I show this other HTML
    </div>
</ItemTemplate>

我显示这个HTML
我显示另一个HTML

我遇到了类似的问题,偶然发现了这一页。谢谢你的回答,Gavin和Keltex让我走上了正确的道路,但是我在页面上做这件事时遇到了一点麻烦。最终,我能够让它与这个布尔值一起工作,所以我想与子孙后代分享:

如果为false,则显示复选框

<asp:CheckBox ID="chk_FollowUp" Visible='<%# (DataBinder.Eval(Container.DataItem, "FollowUp").ToString() == "False") %>' runat="server" />
<asp:Image ID="img_FollowUp" AlternateText="Flagged" ImageUrl="Images/flag.gif" runat="server"
     Visible='<%# DataBinder.Eval(Container.DataItem, "FollowUp") %>' Height="30" Width="30" />

如果为真,则显示标志img

<asp:CheckBox ID="chk_FollowUp" Visible='<%# (DataBinder.Eval(Container.DataItem, "FollowUp").ToString() == "False") %>' runat="server" />
<asp:Image ID="img_FollowUp" AlternateText="Flagged" ImageUrl="Images/flag.gif" runat="server"
     Visible='<%# DataBinder.Eval(Container.DataItem, "FollowUp") %>' Height="30" Width="30" />

首先,您必须在Page.cs文件中定义一个计数变量

 <%if (Count == 0)
                         {
                             %>
                    <div style="background-color:#cfe9ed" class="wid_100 left special_text"><%# Eval("CompanyName") %></div>
                       <%}
                         else if (Count == TotalCount - 1)
                         {
                             %>
                        <div style="background-color:#f2f1aa" class="wid_100 left special_text"><%# Eval("CompanyName") %></div>
                        <%}
                         else
                         {
                              %>
                       <div class="wid_100 left special_text"><%# Eval("CompanyName") %></div><% } %>
                       <%Count++;  %>


在if语句中,您使用的是赋值而不是相等运算符…这是打字错误还是实际代码的格式?Container.dataitem仅存在于。。变量标记,例如,你是对的,我记得我做过类似的事情,现在我在看我的代码,它是非数据索引值上的逻辑。是的,我想过这样做,它会起作用,但有点变通。我已经决定repeater不适合这个任务,而去进行for/next循环,效果很好。我认为这是问题的关键,在使用repeater之前,将数据彻底清理干净。如果你能在转发器中使用基本的比较器,生活会很美好。如果决策逻辑将由无法访问底层C#代码的Frontender定义和使用,这是一个很好的解决方案。HTML仍将被处理两次。。。。只是因为它具有visible并不意味着编译器将跳过codeoh的该部分,并使用以下命令在它们之间切换:
((复选框)sender).NamingContainer.FindControl(“chk_FollowUp”).visible=false;((复选框)sender.NamingContainer.FindControl(“img_FollowUp”).Visible=true