在Repeater中更新面板中匹配ID - “已经包含...的定义”

时间:2012-02-17 14:43:53

标签: asp.net updatepanel repeater

我有疑问,为什么单独的转发器中的2个控件如果在更新面板中,则不能具有相同的ID,但如果它们不在更新面板中,则它们可以共享相同的ID。看到这段代码......

    <asp:Repeater ID="rptFirstRepeater" runat="server">
        <ItemTemplate>
            <asp:Image runat="server" ID="imgThisWorks" />
            <asp:UpdatePanel runat="server">
                <ContentTemplate>
                    <asp:Image runat="server" ID="imgThisDoesntWork" />
                </ContentTemplate>
            </asp:UpdatePanel>
        </ItemTemplate>
    </asp:Repeater>

    <asp:Repeater ID="rptSecondRepeater" runat="server">
        <ItemTemplate>
            <asp:Image runat="server" ID="imgThisWorks" />
            <asp:UpdatePanel runat="server">
                <ContentTemplate>
                    <asp:Image runat="server" ID="imgThisDoesntWork" />
                </ContentTemplate>
            </asp:UpdatePanel>
        </ItemTemplate>
    </asp:Repeater>

生成此错误:

CS0102: The type 'ASP._8_admin_testemail_aspx' already contains a definition for 'imgThisDoesntWork'

但如果您不使用更新面板,它可以正常工作。

    <asp:Repeater ID="rptFirstRepeater" runat="server">
        <ItemTemplate>
            <asp:Image runat="server" ID="imgThisWorks" />
        </ItemTemplate>
    </asp:Repeater>

    <asp:Repeater ID="rptSecondRepeater" runat="server">
        <ItemTemplate>
            <asp:Image runat="server" ID="imgThisWorks" />
        </ItemTemplate>
    </asp:Repeater>

据我所知,转发器中的所有控件都被赋予了新的ID ... ctl00_cttBody_ucTestControl_rptFirstRepeater_ctl00_imgThisWorks

这是否也不适用于更新面板? 我是否可以使用相同的ID使上面的代码工作? - 请忽略这两个中继器真的应该是一个中继器的事实! :)

谢谢,查尔斯。

1 个答案:

答案 0 :(得分:2)

这似乎是一个已知的错误,微软决定不解决:

http://connect.microsoft.com/VisualStudio/feedback/details/417230/updatepanel-breaks-naming-containers-compile-time-bug

  

目前,我们已决定不解决这个具体问题。   幸运的是,有一个非常简单的解决方法 - 避免使用相同的方法   UpdatePanel内外的控件ID。