2009-07-05 22 views
23

Quiero mostrar ciertas partes de un ItemTemplate en función de si un campo encuadernado es nulo. Tomemos como ejemplo el siguiente código:ASP.Net: Lógica condicional en una ItemTemplate de ListView

(Código como LayoutTemplate se han quitado por razones de brevedad)

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

Lo anterior es el siguiente error en tiempo de ejecución:

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

Así ¿Cómo se puede poner alguna lógica condicional (como la anterior) en un ItemTemplate?

+1

Este es el tipo de cosa que está actualmente me está volviendo un poco loco. Esto es FÁCIL en ASP.net MVC pero un drama total en webforms –

Respuesta

34

¿Qué hay de vincular la propiedad "Visible" de un control a su condición? Algo así como:

<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 punto interesante ... pero ¿no hay alguna forma de inyectar bloques lógicos en el ItemTemplate? –

+2

modificó su respuesta para devolver un bool en lugar de la cadena –

+1

Lo intenté recientemente y obtuve un error de tiempo de ejecución: "La etiqueta del servidor no está bien formada". – Kyle

6

no estoy recomendando esto como un buen enfoque, pero se puede solucionar este problema mediante la captura del elemento actual en caso OnItemDataBound, almacenándolo en una propiedad pública o en el campo y luego usar que, en su lógica condicional.

Por ejemplo:

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

Y en el lado del servidor Agregue el código siguiente a su código detrás de archivo:

public MusicItem CurrentItem { get; private set;} 

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

Tenga en cuenta que este truco no funcionará en un control UpdatePanel.

1

continuación Si usted tiene 2 estructura diferente que van a ser realizadas en concordancia con una condición usar paneles

<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

Para resolver "La etiqueta servidor no está bien formado." para las respuestas que implican visibilidad, elimine las comillas del parámetro Visible =.

lo que se convertirá:

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

También puede simplemente usar comillas simples alrededor de la condición. Tuve comillas dobles y obtuve la "etiqueta del servidor no está bien formada", pero cuando las cambié a comillas simples funcionó bien. –

Cuestiones relacionadas