2

考虑以下代码片段:

<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") %>
<% } %>

它没有用,而且看起来很丑!

4

6 回答 6

2

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

<%#( DataBinder.Eval(Container.DataItem,"Item1)==null ?DataBinder.Eval(Container.DataItem,"Item1"):
DataBinder.Eval(Container.DataItem,"Item2"))%>
于 2013-03-14T11:24:43.383 回答
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>
于 2013-03-14T11:25:28.520 回答
2

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

<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

于 2013-03-14T12:22:35.263 回答
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;
}
于 2013-03-14T11:27:29.803 回答
0

绑定时,您可以在“ItemData2”前面添加换行符和空格。IE,

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

把它分成两行。

于 2013-03-14T11:23:52.030 回答
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>
于 2013-03-14T11:36:37.647 回答