使用ASP.NET进行条件html渲染

时间:2013-03-14 11:16:39

标签: c# asp.net html data-binding itemtemplate

请考虑以下代码段:

<asp:TemplateField HeaderText="Item Data">
    <ItemTemplate>
        <%# DataBinder.Eval(Container.DataItem, "ItemData1") %>
        <br />&nbsp;&nbsp;
        <%# DataBinder.Eval(Container.DataItem, "ItemData2") %>
    </ItemTemplate>
</asp:TemplateField>

我需要重构这一点,以便如果ItemData2为空,则<br />&nbsp;&nbsp;不会呈现

我不确定如何实现这一目标。

编辑:我试图像这样添加一个条件:

<% if(DataBinder.Eval(Container.DataItem, "ItemData2") != null) { %>
    <br />&nbsp;&nbsp;
    <%# DataBinder.Eval(Container.DataItem, "ItemData2") %>
<% } %>

它不起作用,看起来真的很难看!

6 个答案:

答案 0 :(得分:2)

在DataBinder.Eval中,您可以像下面那样传递您的条件,这对您有用。

<%#( DataBinder.Eval(Container.DataItem,"Item1)==null ?DataBinder.Eval(Container.DataItem,"Item1"):
DataBinder.Eval(Container.DataItem,"Item2"))%>

答案 1 :(得分:2)

dataBinder.Eval()语句放在asp:literal控件中,然后在CodeBehind中添加DataBinding事件处理程序,并根据您的条件设置Literal2.Visible = false。将<br/ >放在第二个文字中。

请注意,此方法会保留关注点的分离,使您没有C#代码返回HTML代码段,但不是“内联”。

使用转发器的示例,但所有这些控件的工作方式类似:

   void Repeater1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) 
   {

      // Execute the following logic for Items and Alternating Items.
      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
      {

         var dataItem = (YourDataItem)e.Item.DataItem;
         if (null == dataItem.Item2)// this is pseudo code because I don't know what your dataItem looks like 
         {
             ((literal)e.Item.FindControl("Literal2")).Visible = false;
         }
      }
   }    

项目模板如下所示:

<asp:TemplateField HeaderText="Item Data">
    <ItemTemplate>
        <%# DataBinder.Eval(Container.DataItem, "ItemData1") %>
        <asp:Literal Runat="server" ID="Literal2">
            <br />&nbsp;&nbsp;
            <%# DataBinder.Eval(Container.DataItem, "ItemData2") %>
        </asp:Literal>
    </ItemTemplate>
</asp:TemplateField>

答案 2 :(得分:2)

不要使用<br />&nbsp;&nbsp;,而是考虑将这两个项目包装在显示为块的元素中,例如div

<asp:TemplateField HeaderText="Item Data">
    <ItemTemplate>
        <div><%# DataBinder.Eval(Container.DataItem, "ItemData1") %></div>
        <div><%# DataBinder.Eval(Container.DataItem, "ItemData2") %></div>
    </ItemTemplate>
</asp:TemplateField>

如果ItemData2为空,则div将为空白,不占用任何空格或在HTML中生成换行符。

有关示例,请参阅此JSFiddle

答案 3 :(得分:1)

我认为你可以通过在.cs后面的代码中定义公共方法来获取ItemData2然后检查它是否为空它返回想要的标记字符串,如果不返回空字符串

实施例::

<asp:TemplateField HeaderText="Item Data">
    <ItemTemplate>
        <%# DataBinder.Eval(Container.DataItem, "ItemData1") %>        
        CheckEmptyData(Eval("ItemData2").ToString())
    </ItemTemplate>
</asp:TemplateField>

然后在代码背后:

public string CheckEmptyData(string ItemData2)
{
    if (string.IsNullOrEmpty(ItemData2))
        return "";
    else
        return "<br />&nbsp;&nbsp;" + ItemData2;
}

答案 4 :(得分:0)

在绑定时,您可以添加&#34; ItemData2&#34;的换行符和空格。即,

if(ItemData2Field.length>0){
    string item2 = ""+
    "  " + ItemData2;}

将其分为两行。

答案 5 :(得分:0)

根据Jodha的回答,这就是我解决它的方法。当然不是最优雅的解决方案,但我在这里看不到的东西似乎更优雅。

<%# DataBinder.Eval(Container.DataItem, "ItemData2") != null ? DataBinder.Eval(Container.DataItem, "ItemData1") + "<br />&nbsp;&nbsp;<span style=\"color: gray;\">" + DataBinder.Eval(Container.DataItem, "ItemData2") + "</span>" : DataBinder.Eval(Container.DataItem, "ItemData1") %></asp:Label>
相关问题