繁体   English   中英

如何在数据上有条件地修改DataList> ItemTemplate内部的标记/模板?

[英]how to modify markup/template inside of DataList>ItemTemplate conditionally on data?

简单示例:(.NET 3.5)

  1. 返回COL_A和COL_B列的SQLDataSource,

  2. 使用sqldatasource的DataList控件

  3. 我想在“项目模板”中根据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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM