2009-07-05 38 views
23

バインドされたフィールドがnullかどうかによって、ItemTemplateの特定の部分を表示したいとします。例えば、次のコードを取る:ASP.Net:ListViewのItemTemplateの条件付きロジック

<asp:ListView ID="MusicList" runat="server"> 
    <ItemTemplate> 
     <tr> 
      <% 
       if (Eval("DownloadLink") != null) 
       { 
      %> 
      <td> 
       <a href="<%#Eval("DownloadLink") %>">Link</a> 
      </td> 
      <% 
       } %> 
     </tr> 
    </ItemTemplate> 
</asp:ListView> 

は、上記の次の実行時エラーなります(コードLayoutTemplateなどを簡潔にするため削除されました):だから

Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.

ItemTemplateにいくつかの条件付きロジック(上記のようなもの)を入れる方法はありますか?

+1

これは、現在、私に少し狂気を駆動しているものの一種です。これはASP.netのMVCでとても簡単ですが、Webフォームのトータルドラマ –

答えて

34

コントロールの「表示」プロパティを条件にバインドするとどうなりますか?ような何か:

<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> 
+0

面白い点ですが、ItemTemplateにロジックブロックを挿入する方法はありませんか? –

+2

文字列の代わりにboolを返すように答えを修正しました –

+1

私は最近これを試して、ランタイムエラーが発生しました:「サーバータグが正しく構成されていません」 – Kyle

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> 

とサーバ側の

は、ファイルの後ろにあなたのコードに次のコードを追加します。このトリックは UpdatePanel制御で動作しないこと

public MusicItem CurrentItem { get; private set;} 

protected void Item_DataBound(object sender, RepeaterItemEventArgs e) 
{ 
    CurrentItem = (MusicItem) e.Item.DataItem; 
} 

注意。あなたは条件に応じてレンダリングされる2つの異なる構造を持っている場合は

1

は、解決するには、パネル

<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> 
8

を使用し、「サーバーのタグがうまく形成されていません。」可視性を含む回答の場合は、Visible =パラメータから引用符を削除します。

だからとなります:

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

条件の周りに小さな引用符を使用することもできます。私は二重引用符を持っていたし、 "サーバーのタグはうまく形成されていません"が、私は一重引用符に変更したときにうまくいきました。 –