ASP.Net: Logica condizionale in ItemTemplate di un controllo ListView
-
23-08-2019 - |
Domanda
Voglio mostrare alcune parti di un ItemTemplate
base a seconda che un campo associato è nullo. Prendiamo ad esempio il seguente codice:
(codice come LayoutTemplate sono stati rimossi per brevità)
<asp:ListView ID="MusicList" runat="server">
<ItemTemplate>
<tr>
<%
if (Eval("DownloadLink") != null)
{
%>
<td>
<a href="<%#Eval("DownloadLink") %>">Link</a>
</td>
<%
} %>
</tr>
</ItemTemplate>
</asp:ListView>
È possibile che questo ha pronunciato la seguente errore di runtime:
metodi di associazione dati come eval (), XPath () e Bind () possono essere utilizzati solo nel contesto di un controllo con associazione a dati.
Così come si può mettere un po 'di logica condizionale (come sopra) in un ItemTemplate
?
Soluzione
Che dire vincolante la proprietà "visibile" di un controllo per la sua condizione? Qualcosa di simile:
<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>
Altri suggerimenti
Per risolvere "Il tag server non è ben formata." per le risposte che coinvolgono la visibilità, rimuovere le citazioni dal Visible = parametro.
Così diventerà:
<tr runat="server" Visible=<%# Eval("DownloadLink") != null ? true : false %>>
Non sto raccomandando questo come un buon approccio, ma si può ovviare a questo problema catturando l'elemento corrente in caso OnItemDataBound, riporlo in una proprietà pubblica o di un campo e quindi utilizzando che nella vostra logica condizionale.
Ad esempio:
<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>
E sul lato server aggiungere il seguente codice al codice al file:
public MusicItem CurrentItem { get; private set;}
protected void Item_DataBound(object sender, RepeaterItemEventArgs e)
{
CurrentItem = (MusicItem) e.Item.DataItem;
}
Si noti che questo trucco non funziona in un controllo UpdatePanel
.
Se si dispone di 2 struttura diversa che devono essere rese in base a una condizione di utilizzare pannelli
<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>