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

Я хочу показать определенные части 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?


person Andreas Grech    schedule 05.07.2009    source источник
comment
Это то, что в настоящее время сводит меня с ума. Это так ЛЕГКО в ASP.net MVC, но полная драма в веб-формах   -  person Andrew Harry    schedule 12.05.2011


Ответы (4)


А как насчет привязки свойства Visible элемента управления к вашему условию? Что-то типа:

<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>
person Neil Fenwick    schedule 05.07.2009
comment
Хм, интересный момент ... но разве нет способа вставить логические блоки в ItemTemplate? - person Andreas Grech; 05.07.2009
comment
изменил ваш ответ, чтобы вернуть bool вместо строки - person Andreas Grech; 05.07.2009
comment
Я пробовал это недавно и получил сообщение об ошибке выполнения: тег сервера неправильно сформирован. - person Kyle; 09.11.2011
comment
У меня тоже самое @Kyle, если найду работу, обязательно выложу. - person jamesbar2; 22.03.2013
comment
Исправлены кавычки в теге привязки, которые, вероятно, вызывали неправильный формат тега сервера. ошибка. - person Neil Fenwick; 06.08.2015

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

Так оно станет:

<tr runat="server" Visible=<%# Eval("DownloadLink") != null ? true : false %>>
person Shamozzle    schedule 01.08.2013
comment
Вы также можете заключить условие в одинарные кавычки. У меня были двойные кавычки, и тег сервера неправильно сформирован, но когда я изменил их на одинарные кавычки, все заработало. - person Richard Edwards; 19.09.2013

Я не рекомендую это как хороший подход, но вы можете обойти эту проблему, зафиксировав текущий элемент в событии 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 элементом управления.

person MikeD    schedule 23.07.2009

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

<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>
person Zesxter    schedule 07.04.2012