2009-08-21 9 views
6

<asp:Repeater> mich verrückt fahren ..Wie kann ich tun, um eine if-Anweisung innerhalb eines Repeaters

Ich brauche

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

zu tun, aber ich kann nicht für das Leben von mir keinen Weg finden machen das passiert. Ternary ist nicht gut, weil die Menge an HTML ziemlich groß ist, das Setzen von Labels über ein DataBind-Event ist auch nicht sehr gut, da ich im Code-Behind große HTML-Blöcke haben müsste.

Sicherlich gibt es eine Möglichkeit, dies zu tun ....

+4

In Ihrer if-Anweisung verwenden Sie eine Zuweisung und keinen Gleichheitsoperator ... ist das ein Tippfehler oder wie ist Ihr tatsächlicher Code? –

Antwort

7

Sie könnten versuchen, eine Art von Viewmodel-Klasse erstellen, führen Sie die Entscheidung für die Code-Behind, und dann mit Ihrem Repeater glücklich sein, einfach die Anzeige von Daten dass es gegeben wird.

Dies ist eine Möglichkeit, Logik von UI zu trennen. Sie können dann eine dumme UI haben, die einfach Daten anzeigt, ohne sich entscheiden zu müssen, was/wie angezeigt werden soll.

+1

Ich denke, das ist der springende Punkt, haben die Daten vor der Verwendung eines Repeaters völlig sauber. Das Leben wäre schön, wenn Sie grundlegende Komparatoren im Repeater verwenden könnten. – Monsters

3

Sie können dies tun, mit Benutzerkontrollen:

<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

Ja, ich dachte daran, es würde funktionieren, aber ein bisschen wie ein Workaround. Ich habe beschlossen, dass Repeater einfach nicht für die Aufgabe geeignet ist, und für eine for/next-Schleife gegangen ist, funktioniert ein Leckerbissen. – Monsters

3

Sehen aus wie ich mit der eigentlichen Datenbindung dieses gemischt wurde

Sie können es wie so tun:

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

+0

Container.dataitem existiert nur in der Variable ..? Markup, z.B. <% # – Monsters

+0

Sie haben Recht, ich dachte, ich hätte mich daran erinnert, so etwas getan zu haben, und jetzt, wo ich meinen Code anschaue, war es Logik auf nicht-datengebundenen Werten. –

19

Y ou könnte serverseitige Sichtbarkeit verwenden:

<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

Das ist eigentlich eine ziemlich gute Lösung. – Monsters

+0

Dies ist eine gute Lösung, wenn Entscheidungslogik von Frontendern definiert und verwendet werden soll, die keinen Zugriff auf den zugrunde liegenden C# -Code haben. – mslot

+0

Der HTML-Code wird immer noch zweimal verarbeitet ... nur weil er sichtbar ist, bedeutet das nicht, dass der Compiler diesen Codeabschnitt –

0

Ich hatte ein ähnliches Problem und stolperte über diese Seite. Danke für die tollen Antworten, Gavin und Keltex haben mich auf den richtigen Weg gebracht, aber ich hatte ein bisschen eine knifflige Zeit, um das auf meiner Seite zum Laufen zu bringen. Ich war in der Lage, um es mit diesem boolean arbeiten Letztlich also wollte ich für die Nachwelt teilen:

anzeigen Checkbox, wenn falsche

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

zeigen Flagge img wenn sie wahr

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

überspringt und zwischen ihnen mit: '((CheckBox) sender) .NamingContainer.FindControl ("chk_FollowUp"). Visible = false; ((CheckBox) sender) .NamingContainer.FindControl ("img_FollowUp"). Visible = true; ' – RJB

0

Zuerst müssen Sie eine Zählvariable in Ihrer Page.cs-Datei definieren.

<%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++; %>