2014-02-21 66 views
1

簡單的例子:(.NET 3.5)如何修改DataList> ItemTemplate內的數據有條件的標記/模板?

  1. 一個SqlDataSource返回爲col_a和COL_B列,

  2. DataList控件使用 「項目模板」 裏面的SqlDataSource

  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傳遞的值?

+0

我編輯了您的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

0

使用這樣的腳本代碼可能不起作用。我認爲您不能將腳本與模板控件混合使用:腳本在與數據綁定不同的時間進行解釋。

但是,您可以做的事情是在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> 

然後在你的用戶控件的標記,你有兩個或多個Panel控件:

<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事件代碼隱藏(不使用負載,因爲你在親代結合不會有尚未發生):

panel1.Visible = false; 
panel2.Visible = false; 
if(this.ColB > 100) 
    panel1.Visible = true; 
else 
    panel2.Visible = true; 

您可以促進這兩個Panel控件到你的父頁面,但你必須做的一.FindControl()調用ItemDataBound事件處理程序在orde中r來更改它們的屬性,並從e.Item.DataItem屬性中提取COL_B的值。很多檢索值和鑄造。

1

ItemTemplate中不支持條件標記。你可以在這裏做的最好的是讓你的跨服務器端和操縱他們的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> 
    ... 

或者你可以在佔位符包裝他們,如果你想 - 可能會有點清潔的解決方案。

0

謝謝大家的意見,它指導我走向解決方案。

但是,我發現了一個不同的解決方案,我會在這裏分享,因爲它是整潔和簡單:

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