2009-08-21 11 views
6

<asp:Repeater> doprowadza mnie do szaleństwa ..Jak mogę zrobić if wewnątrz repeater

muszę zrobić

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

Ale nie mogę dla życia mnie znaleźć jakiś sposób, aby to się stało. Ternary nie jest dobre, ponieważ ilość HTML jest dość duża, ustawienie etykiet przez zdarzenie DataBind również nie jest zbyt dobre, ponieważ musiałbym mieć duże bloki HTML w kodzie z tyłu.

pewnością istnieje sposób, aby to zrobić ....

+4

W instrukcji if używasz przypisania, a nie operatora równości ... czy to literówka, czy też faktyczny kod? –

Odpowiedz

7

Można spróbować tworząc rodzaj klasy ViewModel, czy decyzję o kodzie opóźnieniem, a następnie być zadowolony z repeatera, po prostu wyświetlając dane że jest dany.

To jest sposób na oddzielenie logiki od interfejsu użytkownika. Możesz wtedy użyć głupiego interfejsu użytkownika, który po prostu wyświetla dane, bez konieczności decydowania o tym, co/jak pokazać.

+1

Myślę, że to jest sedno tego problemu, ponieważ dane są całkowicie czyste przed użyciem wzmacniaka. Życie byłoby miłe, gdyby można było używać podstawowych komparatorów w repeterze. – Monsters

3

Można to zrobić z kontroli użytkownika:

<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

Tak, myślałem o zrobieniu tego, to zadziała, ale trochę obejścia. Postanowiłem, że repeater po prostu nie nadaje się do tego zadania, i przeszedł na pętlę for/next, działa przyjemnie. – Monsters

3

Wygląda jak mam to miesza się z rzeczywistym wiązania z danymi

Można to zrobić tak:

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

+0

Container.dataitem istnieje tylko w zmiennej ..? znaczniki, np. <% # – Monsters

+0

Masz rację, myślałem, że pamiętam, że robiłem coś takiego i teraz, gdy patrzę na mój kod, logika dotyczy wartości nie związanych z pamięcią danych. –

19

Y możesz użyć widoczności po stronie serwera:

<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

To właściwie całkiem niezłe rozwiązanie. – Monsters

+0

jest to dobre rozwiązanie, jeśli logika decyzyjna zostanie zdefiniowana i użyta przez frontendery, która nie ma dostępu do podstawowego kodu C#. – mslot

+0

HTML będzie nadal przetwarzany dwa razy ... ponieważ jego widoczność nie oznacza, że ​​kompilator pominie ten fragment kodu: –

0

Miałem podobny problem i natknąłem się na tę stronę. Dzięki za wspaniałe odpowiedzi, Gavin i Keltex doprowadzili mnie na właściwą drogę, ale miałem trochę trudnego czasu, aby to zadziałało na mojej stronie. Ostatecznie udało mi się zmusić go do pracy z tym logiczną, więc chciałem podzielić się dla potomności:

Pokaż pole wyboru, jeśli fałszywy

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

Pokaż Oznacz img jeśli prawdziwej

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

oh i przełącza między nimi za pomocą: '((CheckBox) sender) .NamingContainer.FindControl ("chk_FollowUp"). Visible = false; ((CheckBox) sender) .NamingContainer.FindControl ("img_FollowUp") Visible = true; ' – RJB

0

Najpierw musisz zdefiniować zmienną Count w pliku 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++; %> 
Powiązane problemy