2009-07-05 20 views
23

Ich möchte bestimmte Teile eines ItemTemplate basierend darauf zeigen, ob ein gebundenes Feld Null ist. Nehmen Sie zum Beispiel den folgenden Code:ASP.Net: Bedingte Logik in einem ListView ItemTemplate

(-Code wie Layouttemplate wurden aus Gründen der Kürze entfernt)

<asp:ListView ID="MusicList" runat="server"> 
    <ItemTemplate> 
     <tr> 
      <% 
       if (Eval("DownloadLink") != null) 
       { 
      %> 
      <td> 
       <a href="<%#Eval("DownloadLink") %>">Link</a> 
      </td> 
      <% 
       } %> 
     </tr> 
    </ItemTemplate> 
</asp:ListView> 

Die obige Abbildung zeigt die folgende Laufzeitfehler:

Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.

So Wie kann man eine bedingte Logik (wie oben) in eine ItemTemplate setzen?

+1

Dies ist die Art der Sache ist, die gerade mich ein bisschen verrückt. Dies ist so einfach in ASP.net MVC noch eine totale Drama in Webforms –

Antwort

34

Was ist mit der Bindung der "Visible" -Eigenschaft einer Kontrolle an Ihre Bedingung? Etwas wie:

<asp:ListView ID="MusicList" runat="server"> 
    <ItemTemplate> 
    <tr runat="server" Visible='<%# Eval("DownloadLink") != null %>'> 
     <td> 
      <a href='<%#Eval("DownloadLink") %>'>Link</a> 
     </td> 
    </tr> 
    </ItemTemplate> 
</asp:ListView> 
+0

Hmm interessanter Punkt ... aber gibt es nicht eine Möglichkeit, Logikblöcke in der ItemTemplate injizieren? –

+2

Ihre Antwort geändert, um eine Bool anstelle von String –

+1

Ich habe dies vor kurzem versucht und einen Laufzeitfehler erhalten: "Das Server-Tag ist nicht gut gebildet." – Kyle

6

Ich empfehle dies nicht als guter Ansatz, aber Sie können durch die Erfassung des aktuellen Elements in der OnItemDataBound Ereignis, das Speichern in öffentlichen Eigenschaft oder ein Feld und dann um dieses Problem zu umgehen mit, dass in Ihre bedingte Logik.

Zum Beispiel:

<asp:ListView ID="MusicList" OnItemDataBound="Item_DataBound" runat="server"> 
    <ItemTemplate> 
     <tr> 
      <% 
       if (CurrentItem.DownloadLink != null) 
       { 
      %> 
      <td> 
       <a href="<%#Eval("DownloadLink") %>">Link</a> 
      </td> 
      <% 
       } %> 
     </tr> 
    </ItemTemplate> 
</asp:ListView> 

Und auf der Server-Seite den folgenden Code, um Ihren Code hinter Datei hinzufügen:

public MusicItem CurrentItem { get; private set;} 

protected void Item_DataBound(object sender, RepeaterItemEventArgs e) 
{ 
    CurrentItem = (MusicItem) e.Item.DataItem; 
} 

Beachten Sie, dass dieser Trick nicht in einer UpdatePanel Kontrolle arbeiten.

1

Wenn Sie zwei unterschiedliche Struktur haben, die nach einer Bedingung gemacht werden, sind dann mit Platten

<asp:ListView ID="MusicList" runat="server"> 
    <ItemTemplate> 
     <tr> 
      <asp:Panel ID="DownloadNull" runat="server" Visible="<%# Eval("DownloadLink") == null %>" > 
      <td> Album Description BlaBlaBla <img src="../images/test.gif"> </td> 
      </asp:Panel> 

      <asp:Panel ID="DownloadNotNull" runat="server" Visible="<%# Eval("DownloadLink") != null %>" > 
      <td> Album Description BlaBlaBla <img src="../images/test.gif"> 
       <a href='<%# Eval("DownloadLink")' >Download</a> 
       ..... 
      </td> 
      </asp:Panel> 
     </tr> 
    </ItemTemplate> 
</asp:ListView> 
8

zu beheben „Der Server-Tag ist nicht gut ausgebildet.“ Für die Antworten mit Sichtbarkeit entfernen Sie die Anführungszeichen aus dem Parameter Visible =.

es wird also werden:

<tr runat="server" Visible=<%# Eval("DownloadLink") != null ? true : false %>> 
+1

Sie können auch einfache Anführungszeichen um die Bedingung verwenden. Ich hatte doppelte Anführungszeichen und bekam das "Server-Tag ist nicht gut geformt", aber wenn ich sie in einfache Anführungszeichen änderte, funktionierte es gut. –