7

假设我有一个看起来像这样的类结构:

public class A
{
    public string Poperty1 { get; set; }
    public string Poperty2 { get; set; }
    public List<B> Property3 { get; set; }
}

public class B
{
    public string Property4 { get; set; }
    public string Property5 { get; set; }
}

...和几个看起来像这样的嵌套中继器:

<asp:Repeater ItemType="A" runat="server">
    <ItemTemplate>
        <asp:Label Text="<%# Item.Property1 %>" runat="server" />
        <asp:Repeater runat="server" DataSource="<%# Item.Property3 %>" ItemType="B">
            <ItemTemplate>
                <asp:Label Text="<%# Item.Property4 %>" runat="server" />
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>

如何从第二个中继器访问 Property2?

4

4 回答 4

9

好吧,从访问嵌套转发器中的父数据,在 HeaderTemplate中,我找到了以下解决方案。这不是最漂亮的,但它有效:

<%# ((Container.Parent.Parent as RepeaterItem).DataItem as A).Property2 %>
于 2013-05-02T18:00:43.527 回答
3

您可以使用通用元组作为内部转发器的类型,并从外部转发器传递 Item:

<asp:Repeater ItemType="A" runat="server" ID="Rpt">
    <ItemTemplate>
        <asp:Label Text="<%# Item.Property1 %>" runat="server" />
        <asp:Repeater runat="server" 
            DataSource="<%#  Item.Property3.Select(innerItem => new Tuple<A,B>(Item, innerItem)) %>" 
            ItemType="System.Tuple<A,B>">
            <ItemTemplate>
                <asp:Label Text="<%# Item.Item2.Property4 %>" runat="server" />
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>

请注意,ReSharper 将反对在 ItemType 中使用泛型!

这是一个不同的例子,更接近我正在做的事情:

<asp:Repeater runat="server" ID="RptWeekNumbers" ItemType="System.Int32">
    <ItemTemplate>
        <asp:Repeater runat="server" 
            DataSource="<%# Enumerable.Range(1, 5).Select(day => new Tuple<int,int>(Item, day))%>" 
            ItemType="System.Tuple<int,int>">
            <ItemTemplate>
                WeekNumber: <%# Item.Item1 %>, 
                DayNumber: <%# Item.Item2 %>
                <br />
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>
于 2013-06-24T14:22:07.270 回答
1

为内部中继器设置 DataSource 时:

DataSource='<%# Eval("Property3") %>'

设置值时请注意单引号。

于 2015-09-09T21:53:24.830 回答
0

您可以将父中继器的 Item 分配给单独的变量。

<script runat="server">
    A parentItem;
</script>
<asp:Repeater ItemType="A" runat="server">
    <ItemTemplate>
        <%# parentItem = Item %>
        <asp:Label Text="<%# Item.Property1 %>" runat="server" />
        <asp:Repeater runat="server" DataSource="<%# Item.Property3 %>" ItemType="B">
            <ItemTemplate>
                <asp:Label Text="<%# parentItem.Property4 %>" runat="server" />
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>

请注意,数据绑定表达式中的赋值将在 html 中呈现表达式的 ToString 值。您可能想要覆盖您的类型的 ToString 方法A,或者将赋值包装在返回的辅助函数中null

于 2020-12-14T14:09:40.647 回答