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>