2009-07-05 17 views
23

Chcę wyświetlić określone części obiektu ItemTemplate w zależności od tego, czy powiązane pole ma wartość zerową. Weźmy na przykład następujący kod:ASP.Net: Logika warunkowa w obiekcie ListView ItemTemplate

(Kod takich jak LayoutTemplate zostały usunięte dla zwięzłość)

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

Powyższe daje następujący błąd czasu wykonywania:

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

So jak umieścić logikę warunkową (jak wyżej) w ItemTemplate?

+1

Jest to rodzaj rzeczy, który jest obecnie jazdy mnie nieco szalona. To jest tak ŁATWE w ASP.net MVC, ale cały dramat w webformach –

Odpowiedz

34

Co powiesz na powiązanie właściwości "Widoczne" kontroli ze swoim stanem? Coś jak:

<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 interesujący punkt ... ale czy nie ma jakiegoś sposobu na wstrzykiwanie bloków logicznych w ItemTemplate? –

+2

zmodyfikował twoją odpowiedź, aby zwrócić bool zamiast łańcucha –

+1

Próbowałem tego ostatnio i otrzymałem błąd runtime: "Znacznik serwera nie jest dobrze uformowany." – Kyle

6

Ja nie polecam tego jako dobre podejście, ale można obejść ten problem poprzez przechwytywanie aktualną pozycję w przypadku OnItemDataBound, przechowywanie go w własności publicznej lub pola, a następnie przy użyciu, że w twoja logika warunkowa.

Na przykład:

<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> 

A po stronie serwera dodać następujący kod do kodu za pliku:

public MusicItem CurrentItem { get; private set;} 

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

Zauważ, że ta sztuczka nie zadziała w kontroli UpdatePanel.

1

Jeśli masz 2 różne struktury, które mają być świadczone według stanu następnie wykorzystać panele

<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

Aby rozwiązać „Znacznik serwer nie jest dobrze uformowane.” aby uzyskać odpowiedzi wymagające widoczności, usuń cytaty z parametru Visible =.

Tak będzie stać:

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

Możesz także użyć pojedynczych cudzysłowów wokół warunku. Miałem podwójne cytaty i otrzymałem "znacznik serwera nie jest dobrze sformułowany", ale kiedy zmieniłem je na pojedyncze cytaty, działało dobrze. –