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
?
Ответы
Ответ 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>