在嵌套的强类型转发器中访问父数据

时间:2013-05-02 17:35:52

标签: c# asp.net webforms

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

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?

3 个答案:

答案 0 :(得分:8)

好吧,从Accessing parent data in nested repeater, in the HeaderTemplate开始,我找到了以下解决方案。它不是最漂亮的,但它确实有效:

<%# ((Container.Parent.Parent as RepeaterItem).DataItem as A).Property2 %>

答案 1 :(得分: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>

答案 2 :(得分:0)

您可以将父级中继器的项目分配给一个单独的变量。

<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值。您可能想覆盖类型A的ToString方法,或者将赋值包装在返回null的辅助函数中。