バインドされたフィールドが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
に配置するにはどうすればよいですか?
コントロールの "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>
「サーバータグの形式が正しくありません」を解決するには。可視性を含む回答の場合、Visible =パラメータから引用符を削除します。
したがって、次のようになります。
<tr runat="server" Visible=<%# Eval("DownloadLink") != null ? true : false %>>
これは良い方法としてはお勧めしませんが、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
コントロールでは機能しないことに注意してください。
条件に従ってレンダリングされる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>