[英]how to modify markup/template inside of DataList>ItemTemplate conditionally on data?
简单示例:(.NET 3.5)
返回COL_A和COL_B列的SQLDataSource,
使用sqldatasource的DataList控件
我想在“项目模板”中根据A或B的值设置不同的部分:
<ItemTemplate> <span class="item_title"><%# Eval("COL_A")%></span><br/> <% if ( GET_DATA("COL_B") > 100 ) { %> <span>SOMETHING HERE</span> <% } else { %> <span>DIFFERENT MARKUP HERE</span> <span>SOMETHING COMPLETELY DIFFERENT HERE</span> <% } %>
问题是:用什么代替GET_DATA来访问从SQL传递的值?
ItemTemplate不支持条件标记。 您在这里可以做的最好的事情是使spans成为服务器端并操纵其Visible属性:
<ItemTemplate>
<span class="item_title"><%# Eval("COL_A")%></span><br/>
<span runat="server" Visible='<%# (int)Eval("COL_B") > 100 %>'>
SOMETHING HERE
</span>
<span runat="server" Visible='<%# (int)Eval("COL_B") <= 100 %>'>
DIFFERENT MARKUP HERE
</span>
...
或者,您可以根据需要将它们包装在占位符中-可能是一种更干净的解决方案。
像这样使用脚本代码可能行不通。 我认为您不能将脚本与模板控件混在一起:脚本在与数据绑定不同的时间进行解释。
但是,您可以做的是,在ItemTemplate中有一个UserControl,它为ColB
定义了一个属性,并根据COL_B
的值显示不同的标记。
<ItemTemplate>
<span class="item_title"><%# Eval("COL_A")%></span><br/>
<uc1:UserControl1 runat="server" ColB='<%# (int)Eval("COL_B") %>' />
</ItemTemplate>
然后,在用户控件标记中,您将拥有两个或多个面板控件:
<asp:Panel id="panel1" runat="server">
<span>SOMETHING HERE</span>
</asp:Panel>
<asp:Panel id="panel2" runat="server">
<span>DIFFERENT MARKUP HERE</span>
<span>SOMETHING COMPLETELY DIFFERENT HERE</span>
</asp:Panel>
...,然后在代码中隐藏用户控件的PreRender事件中(不要使用Load,因为在父级中的绑定尚未发生):
panel1.Visible = false;
panel2.Visible = false;
if(this.ColB > 100)
panel1.Visible = true;
else
panel2.Visible = true;
您可以将这两个Panel控件提升到父页面,但随后必须在ItemDataBound事件处理程序中进行.FindControl()调用,以更改其属性,并从e.Item中提取COL_B
的值。 DataItem属性。 许多检索值和强制转换。
谢谢大家的投入,它使我找到了解决方案。
但是,我发现了一个简洁而又简单的解决方案,我将在这里分享:
asp:PlaceHolder
元素可以嵌套多次以生成非常干净的HTML输出。 下面的例子:
<asp:DataList ID="DataListLeft" runat="server" DataSourceID="SqlDataSource1"
RepeatLayout="Flow" RepeatDirection="Horizontal" >
<ItemTemplate>
<asp:PlaceHolder ID="PlaceHolder1" runat="server"
Visible='<%# !String.IsNullOrEmpty((string)Eval("COL_A", "{0}")) %>' >
SOME HTML MARKUP HERE WHEN COL_A HAS A VALUE
NOTE THE '!' IN CONDITION
</asp:PlaceHolder>
<asp:PlaceHolder ID="PlaceHolder2" runat="server"
Visible='<%# String.IsNullOrEmpty((string)Eval("COL_A", "{0}")) %>' >
SOME HTML MARKUP HERE WHEN COL_A IS NULL OR EMPTY
eg. <span>Data is not available</span>
</asp:PlaceHolder>
</ItemTemplate>
</asp:DataList>
再次感谢您的宝贵时间。
JK
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.