2009-08-21 173 views
6

<asp:Repeater>被我逼瘋了裏面..我該怎麼辦if語句轉發

我需要做的

<ItemTemplate> 
    <% if (Container.DataItem("property") == "test") {%> 
     I show this HTML 
    <% } else { %> 
     I show this other HTML 
    <% } %> 
</ItemTemplate> 

但我不能爲我的生活找到什麼辦法可以使發生。 Ternary並不是什麼好事,因爲HTML的數量非常大,通過DataBind事件設置標籤也不是很好,因爲我必須在代碼隱藏方面有大塊的HTML。

肯定有辦法做到這一點....

+4

在你的if語句中,你使用的是一個賦值而不是一個相等運算符......這是一個錯字還是你的實際代碼是怎麼樣的? – 2009-08-21 19:20:17

回答

7

你可以嘗試創造一種ViewModel類的,做你的代碼背後的決策,然後很樂意與你的中繼,簡單地顯示數據它正在被給出。

這是一種從UI分離邏輯的方法。然後,您可以擁有一個簡單顯示數據的笨拙UI,而無需決定要顯示什麼/如何顯示。

+1

我認爲這是它的關鍵,在使用中繼器之前將數據完全清理乾淨。如果你可以在轉發器中使用基本的比較器,生活會很好。 – Monsters 2009-08-21 21:01:15

3

你可以與用戶控件做到這一點:

<ItemTemplate> 
    <uc:Content1 runat='server' id='content1' visible='<%# Container.DataItem("property") == "test" %>'/> 
    <uc:Content2 runat='server' id='content2' visible='<%# Container.DataItem("property") != "test" %>'/> 
</ItemTemplate> 
+1

是的,我想這樣做,它會工作,但有點解決方法。我已經決定,中繼器只是沒有完成任務,而去了一個for/next循環,這是一種享受。 – Monsters 2009-08-21 20:59:49

3

貌似我這混了實際的數據綁定

你能做到像這樣:

<asp:Repeater runat="server"> 
    <ItemTemplate>  
     <% if (((Product)Container.DataItem).Enabled) { %> 
     buy it now! 
     <% } else {%> 
     come back later! 
     <% } %> 
    </ItemTemplate> 
</asp:Repeater> 

+0

Container.dataitem僅存在於..變量中?標記,例如<%# – Monsters 2009-08-21 20:59:00

+0

你說得對,我以爲我記得做過這樣的事情,現在我正在看我的代碼,它是非數據綁定值的邏輯。 – 2009-08-21 21:50:52

19

Y OU可以使用服務器端的可視性:

<ItemTemplate> 
    <div runat="server" visible='<% (Container.DataItem("property") == "test") %>'> 
     I show this HTML 
    </div> 
    <div runat="server" visible='<% (Container.DataItem("property") != "test") %>'> 
     I show this other HTML 
    </div> 
</ItemTemplate> 
+0

這實際上是一個很好的解決方案。 – Monsters 2009-08-21 21:03:41

+0

這是一個很好的解決方案,如果決策邏輯將被定義和使用的前哨,不_有權訪問底層的C#代碼。 – mslot 2012-06-07 07:27:00

+0

HTML仍將被處理兩次....只是因爲它具有可見性並不意味着編譯器會跳過代碼 – 2012-09-19 13:33:51

0

我有一個類似的問題和整個這個頁面絆倒了。感謝您的出色答案,Gavin和Keltex讓我走上了正確的軌道,但我有一點點棘手的時間讓我在頁面上工作。最終,我能得到它與這個布爾工作,所以我想分享給後人:

顯示覆選框,如果假

<asp:CheckBox ID="chk_FollowUp" Visible='<%# (DataBinder.Eval(Container.DataItem, "FollowUp").ToString() == "False") %>' runat="server" /> 

放映標誌IMG如果屬實

<asp:Image ID="img_FollowUp" AlternateText="Flagged" ImageUrl="Images/flag.gif" runat="server" 
    Visible='<%# DataBinder.Eval(Container.DataItem, "FollowUp") %>' Height="30" Width="30" /> 
+0

的那一部分哦,並在它們之間切換:'((CheckBox)sender).NamingContainer.FindControl( 「(chk_FollowUp」)。Visible = false;((CheckBox)sender).NamingContainer.FindControl(「img_FollowUp」)。Visible = true; – RJB 2012-07-26 22:13:47

0

首先您必須在您的Page.cs文件中定義計數變量

<%if (Count == 0) 
         { 
          %> 
        <div style="background-color:#cfe9ed" class="wid_100 left special_text"><%# Eval("CompanyName") %></div> 
         <%} 
         else if (Count == TotalCount - 1) 
         { 
          %> 
         <div style="background-color:#f2f1aa" class="wid_100 left special_text"><%# Eval("CompanyName") %></div> 
         <%} 
         else 
         { 
           %> 
         <div class="wid_100 left special_text"><%# Eval("CompanyName") %></div><% } %> 
         <%Count++; %>