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设置成互斥?

ASP.Net:ListView 的 ItemTemplate 中的条件逻辑

ASP.NET中如何获取listview指定列的值

ASP.NET 网格视图与列表视图

ASP.Net中ListView 不能启用编辑的功能了 为啥?