net español ejemplo data compras carrito aspx asp c# asp.net data-binding listview logic

c# - español - ASP.Net: lógica condicional en una ItemTemplate de ListView



listview asp.net ejemplo (4)

¿Qué hay de vincular la propiedad "Visible" de un control a su condición? Algo 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>

Deseo mostrar ciertas partes de una ItemTemplate basada en función de si un campo vinculado es nulo. Tomemos por ejemplo el siguiente código:

(Código como LayoutTemplate ha sido eliminado por 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 proporciona el siguiente error en tiempo de ejecución:

Los métodos de enlace de datos como Eval (), XPath () y Bind () solo se pueden usar en el contexto de un control de datos.

Entonces, ¿cómo se puede poner alguna lógica condicional (como la anterior) en una ItemTemplate ?


No lo recomiendo como un buen enfoque, pero puede solucionar este problema capturando el elemento actual en el evento OnItemDataBound, almacenándolo en una propiedad o campo público y luego utilizándolo 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 siguiente código a su código detrás del 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 .


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

Entonces se convertirá en:

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


Si tiene 2 estructuras diferentes que se van a renderizar de acuerdo con una condición, entonces use 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>