ASP.Net:ListView 的 ItemTemplate 中的条件逻辑
Posted
技术标签:
【中文标题】ASP.Net:ListView 的 ItemTemplate 中的条件逻辑【英文标题】:ASP.Net: Conditional Logic in a ListView's ItemTemplate 【发布时间】:2010-11-08 04:52:16 【问题描述】:我想根据绑定字段是否为空来显示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
中?
【问题讨论】:
这是目前让我有点发疯的事情。这在 ASP.net MVC 中非常简单,但在 webforms 中却是一场大戏 【参考方案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>
【讨论】:
嗯,有趣的一点...但是在 ItemTemplate 中没有注入逻辑块的某种方法吗? 修改了您的答案以返回布尔值而不是字符串 我最近尝试过这个并得到一个运行时错误:“服务器标签格式不正确。” 我得到了同样的东西@Kyle,如果我找到解决办法,我一定会发布它。 修复了可能导致“服务器标签格式不正确”的锚标记中的引号。错误。【参考方案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】:如果您有 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>
【讨论】:
以上是关于ASP.Net:ListView 的 ItemTemplate 中的条件逻辑的主要内容,如果未能解决你的问题,请参考以下文章
关于ASP.NET listview的问题 ASP.NET DIV中放入 listview控件 设计视图布局全乱了
asp.net(C#)怎样将listview中的radiobutton设置成互斥?