【问题标题】:Access parent data in a nested strongly typed repeater在嵌套的强类型中继器中访问父数据
【发布时间】:2013-05-02 17:35:52
【问题描述】:

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

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?

【问题讨论】:

  • 你的意思是DataSource="" 而不是DataSource=""
  • 是的,我做到了。感谢您了解这一点。

标签: c# asp.net webforms


【解决方案1】:

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

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

【讨论】:

  • 我希望有一个解决方案涉及一些包含强类型父级的魔法属性......但我一直无法找到一个......
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    为内部中继器设置数据源时:

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

    设置值时注意单引号。

    【讨论】:

      【解决方案4】:

      您可以将父中继器的 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 的辅助函数中。

      【讨论】:

        猜你喜欢
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-15
        • 2011-02-02
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        相关资源
        最近更新 更多