web-dev-qa-db-ja.com

ASP.Net:ListView ItemTemplateの条件付きロジック

バインドされたフィールドがnullかどうかに基づいて、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に配置するにはどうすればよいですか?

25
Andreas Grech

コントロールの "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>
37
Neil Fenwick

「サーバータグの形式が正しくありません」を解決するには。可視性を含む回答の場合、Visible =パラメータから引用符を削除します。

したがって、次のようになります。

<tr runat="server" Visible=<%# Eval("DownloadLink") != null ? true : false %>>
8
Shamozzle

これは良い方法としてはお勧めしませんが、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コントロールでは機能しないことに注意してください。

6
MikeD

条件に従ってレンダリングされる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>
2
Zesxter