【问题标题】:How use nest Repeaters using a single XMLDataSource?如何使用单个 XMLDataSource 使用嵌套中继器?
【发布时间】:2011-05-03 21:01:53
【问题描述】:

我想使用共享相同 XML 数据源的嵌套转发器,其中父转发器将数据源向下传递给子转发器,因此它不需要为父转发器中的每个数据项重新访问数据源。

父中继器的 XPATH:“/AdpDeselection/Documents/Document[@type='A']/Funds/Fund[@cuspid='1234']”

我会在下面的代码中为子Repeater 中的DataSource 属性添加什么?

我宁愿不必使用 OnItemDataBound,因为我认为它不需要它,但我想我可能错了。

    <asp:XmlDataSource ID="xdsCurrentFunds" runat="server" DataFile="~/App_Data/CustomApps/DeselectOptions.xml" />

    <asp:Repeater ID="rptCurrentFund" runat="server" OnItemDataBound="rptCurrentFund_ItemDataBound" DataSourceID="xdsCurrentFunds">
        <ItemTemplate>
            <div class="CurrentFund"><%# XPath("@name")%></div>
            <asp:HiddenField ID="hdnID" runat="server" Value='<%# XPath("@cuspid")%>' />
            <asp:Repeater ID="rptReplacementFunds" runat="server" DataSource='WHAT SHOULD I PUT HERE TO GET THE DATASOURCE?'>
                <ItemTemplate>
                    <div class="ReplacementFund"><%# XPath("@ticker")%></div>
                </ItemTemplate>
            </asp:Repeater>
        </ItemTemplate>
        <SeparatorTemplate>
            <br />
        </SeparatorTemplate>
    </asp:Repeater>

XML 结构...

<Deselection>
    <Documents>
        <Document type="A">
            <Funds>
                <Fund cuspid="1234" name="CURRENT FUND NUMBER ONE">
                    <ReplacementFunds>
                        <Fund ticker="ABCD" cuspid="56785678">FUND NUMBER ONE</Fund>
                        <Fund ticker="EFGH" cuspid="23452345">FUND NUMBER TWO</Fund>
                    </ReplacementFunds>
                </Fund>
                <Fund cuspid="2345" name="CURRENT FUND NUMBER ONE">
                    <ReplacementFunds>
                        <Fund ticker="HJKL" cuspid="56785678">FUND NUMBER THREE</Fund>
                        <Fund ticker="YUIO" cuspid="23452345">FUND NUMBER FOUR</Fund>
                    </ReplacementFunds>
                </Fund>
        </Document>
    </Documents>
</Deselection>

【问题讨论】:

  • 您将需要一个 OnItemDataBound... 在当前设置中... 但是如果您使用 for/foreach-loops 而不是... 这完全消除了中继器的使用.. . 但是接下来你需要在代码隐藏中仔细排列Lists/Arryas中的数据...
  • @sani - 谢谢。但是,我已经看到它这样做了。我只是不确定他们是如何想出 DataSource 属性中的内容的,因为我看到的示例没有显示 XML,所以我看不到 ASP.NET 代码背后的逻辑。
  • 只是为了澄清一件事:使用 Repeaters 和 OnItemDataBound 比滚动自己的 for/foreach 处理更好。中继器的性能会受到影响(有人告诉过我),但除非您有一个非常繁忙的站点,否则中继器就足够了......
  • 而对于您应该放入子数据源项的内容,它应该是反映 ReplacementFunds 列表/数组的父数据类型属性。
  • @sani - 谢谢;您可以将其添加为答案,以便我接受它来给您信用吗?

标签: .net xml repeater xmldatasource


【解决方案1】:

经过更广泛的挖掘,我实际上找到了答案。这是工作代码:

<asp:XmlDataSource ID="xdsCurrentFunds" runat="server" DataFile="~/App_Data/CustomApps/DeselectOptions.xml" />

<asp:Repeater ID="rptCurrentFund" runat="server" OnItemDataBound="rptCurrentFund_ItemDataBound" DataSourceID="xdsCurrentFunds">
    <ItemTemplate>
        <div class="CurrentFund"><%# XPath("@name")%></div>
        <asp:Repeater ID="rptReplacementFunds" runat="server" DataSource='<%# XPathSelect("ReplacementFunds/*") %>'>
            <ItemTemplate>
                <div class="ReplacementFund"><%# XPath("@ticker")%></div>
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
    <SeparatorTemplate>
        <br />
    </SeparatorTemplate>
</asp:Repeater>

这就像一个魅力,不需要 OnItemDataBound 代码。

The secret sauce is the XPathSelect apparently.

【讨论】:

  • 你说没有OnItemDataBound,但在你的代码中有OnItemDataBound="rptCurrentFund_ItemDataBound" - 那么哪一部分是真的?
  • 我不记得了 - 可能只是被注释掉了/当我试图弄清楚这一切时,它只是在那里的空函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多