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

And*_*ech 25 c# asp.net data-binding logic 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>
Run Code Online (Sandbox Code Playgroud)

以上给出了以下运行时错误:

数据绑定方法(如Eval(),XPath()和Bind())只能在数据绑定控件的上下文中使用.

那么如何将一些条件逻辑(如上所述)放入ItemTemplate

Nei*_*ick 37

将控件的"可见"属性绑定到您的状态怎么样?就像是:

<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>
Run Code Online (Sandbox Code Playgroud)

  • 修改你的答案返回bool而不是字符串 (2认同)

小智 8

解决"服务器标签格式不正确".对于涉及可见性的答案,请从Visible =参数中删除引号.

所以它将成为:

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


Mik*_*keD 6

我不建议这是一个好的方法,但你可以通过捕获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>
Run Code Online (Sandbox Code Playgroud)

并在服务器端将以下代码添加到您的代码隐藏文件:

public MusicItem CurrentItem { get; private set;}

protected void Item_DataBound(object sender, RepeaterItemEventArgs e)
{
   CurrentItem = (MusicItem) e.Item.DataItem;
}
Run Code Online (Sandbox Code Playgroud)

请注意,此技巧在UpdatePanel控件中不起作用.