問題

我有一個ASP.NET頁面,它使用巢狀在另一箇中繼器中的中繼器來生成資料列表.它的效果如下:

 <asp:Repeater>
    <ItemTemplate>
        <span><%#Eval("Data1") %></span>
        <!-- and many more -->
        <asp:Repeater DataSource='<%#Eval("Data2")%>'>
            <HeaderTemplate>
                <ul>
            </HeaderTemplate>
            <ItemTemplate>
                <li><%#Container.DataItem%></li>
            </ItemTemplate>
            <FooterTemplate>
                </ul>
            </FooterTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>
 

在(C#)code-背後,我基本上使用LINQ從XML文件中提取資訊列表並將該資訊繫結到第一個中繼器.

搜尋這個答案,似乎方法是確定巢狀中繼器的資料是否為空.如果是,則將中繼器的可見度設定為false.

不幸的是,我無法確定如何在內聯中執行此操作,而不是在程式碼後面(因為它不一定適用於我正在做的事情).

由於我的頁面現在沒有驗證,因為ul最終對沒有Data2的任何專案都是空的,因為我想繼續使用無序列表,我尋求你的幫助.

有任何想法嗎?

謝謝!

更新:

如果它有幫助,因為它很可能在code-found中執行,LINQ是這樣的事情:

 var x = from y in z
    select new {
        Data1 = d,
        // etcetera
        Data2 = (from j in k
            where j.Value != String.Empty
            select j.Value).ToList()
    };

blah.DataSource = x;
blah.DataBind();
 

  最佳答案

這不會完全隱藏中繼器,但您可以將Repeater控制元件子類化,以便它包含類似GridView的空資料模板:

 using System;
using System.Web.UI;
using System.Web.UI.WebControls;

public class EmptyCapableRepeater : Repeater
{
    public ITemplate EmptyDataTemplate { get; set; }

    protected override void OnDataBinding ( EventArgs e )
    {
        base.OnDataBinding( e );

        if ( this.Items.Count == 0 )
        {
            EmptyDataTemplate.InstantiateIn( this );
        }
    }
}
 

你可以在你的.aspx中使用它,如下所示:

 <custom:EmptyCapableRepeater runat="server" ID="rptSearchResults">
    <ItemTemplate>
        <%# Eval( "Result" )%>
    </ItemTemplate>
    <SeparatorTemplate>
        <br />
    </SeparatorTemplate>
    <EmptyDataTemplate>
        <em>No results were found.</em>
    </EmptyDataTemplate>
</custom:EmptyCapableRepeater>
 

  相同標籤的其他問題

c#asp.netrepeater