访问嵌套强类型重复器中的父数据
本文关键字:数据 嵌套 强类型 访问 | 更新日期: 2023-09-27 18:11:57
假设我有一个像这样的类结构:
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 ?
嗯,从访问嵌套中继器中的父数据,在HeaderTemplate中,我找到了以下解决方案。它不是最漂亮的,但它有效:
<%# ((Container.Parent.Parent as RepeaterItem).DataItem as A).Property2 %>
您可以使用泛型元组作为内部重复器的类型,并从外部重复器传递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>
设置内部中继器的数据源时:
DataSource='<%# Eval("Property3") %>'
你可以将父重复器的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值。您可能希望覆盖类型为A
的ToString方法,或者将赋值封装在返回null
的辅助函数中。