Подтвердить что ты не робот

ASP.Net: условная логика в элементе ListView ItemTemplate

Я хочу показать определенные части ItemTemplate на основе того, является ли связанное поле нулевым. Возьмем, к примеру, следующий код:

(Код, такой как LayoutTemplate, был удален для краткости)

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

Приведенная выше дает следующую ошибку времени выполнения:

Способы связывания данных, такие как Eval(), XPath() и Bind() могут использоваться только в контексте управления базой данных.

Итак, как можно поставить некоторую условную логику (например, выше) в ItemTemplate?

4b9b3361

Ответ 1

Как связать свойство "Видимое" элемента управления с вашим состоянием? Что-то вроде:

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

Ответ 2

Чтобы разрешить "Тег сервера плохо сформирован". для ответов, связанных с видимостью, удалите кавычки из параметра Visible =.

Так оно и будет:

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

Ответ 3

Я не рекомендую это как хороший подход, но вы можете обойти эту проблему, захватив текущий элемент в событии OnItemDataBound, сохраняя его в общедоступном свойстве или в поле, а затем используя это в своей условной логике.

Например:

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

И на стороне сервера добавьте следующий код в свой код за файлом:

public MusicItem CurrentItem { get; private set;}

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

Обратите внимание, что этот трюк не будет работать в элементе управления UpdatePanel.

Ответ 4

Если у вас есть две разные структуры, которые должны отображаться в соответствии с условием, используйте панели

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