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?

È stato utile?

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top