2013-03-14 37 views
2

渲染请看下面的代码片段:条件HTML与ASP.NET

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

它没有工作,看起来真难看!

回答

2

在DataBinder.Eval中,您可以像下面一样传递您的条件,这将适用于您。

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

绑定时,可以添加“ItemData2”的换行符和空格。即,

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

将其放在两行中。

2

放置一个asp:literal控制内部dataBinder.Eval()声明,然后在代码隐藏添加一个数据绑定的事件处理程序,并根据您的病情设置Literal2.Visible = false。把你的<br/ >放在第二个文字中。

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

一个例子,使用中继器,但所有这些控件的工作同样:

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> 
+0

,或使用'Panel'因此面板可以包含其他控件,如果需要的话。 – Reuben 2014-03-05 00:11:31

1

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

Exa mple ::

<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; 
} 
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> 
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为铸控制`Literal`例子