控件上的容器ID结构添加到转发器

时间:2015-08-20 22:33:50

标签: asp.net

跑过一个奇怪的事情。我们有一个页面,其中包含在Repeater中呈现的项目。列表中的项目有一个用于显示的面板和一个用于编辑模式的PlaceHolder,其中控件添加在项目数据绑定中。

我们有一些客户端代码使用已添加的字段,并且代码期望id遵循您通常看到的相同容器结构,但由于某种原因,一个级别被跳过而我不知道这是为什么。

使用下面的模板,您的外部面板的ID为... Repeater_ctl46_ctl100_Display。 PlaceHolder本身不会渲染,也不会包含在html中的id结构中,但添加到EditPlaceHolder的HiddenField的id最终会像... Repeater_ctl46_ctl100_valueHidden。

_Display等级不会出现。这抛弃了我们的客户端脚本,因为它期望外部面板容器反映在编辑模板中的所有子控件中,并且正在使用它来查找它们。

任何人都知道为什么包含Panel不在id层次结构中?

<ItemTemplate>
...
    <asp:Panel ID="Display" runat="server">
        <asp:Panel ID="ViewPanel" runat="server"><asp:Label ID="ValueLabel" runat="server" /></asp:Panel>
        <asp:PlaceHolder ID="EditPlaceHolder" runat="server" />
    </asp:Panel>
    <asp:Panel ID="ModButtons" runat="server"><asp:LinkButton ID="EditButton" Text="<%$ Resources:Messages,Edit %>" runat="server" /></asp:Panel>
...
</ItemTemplate>

1 个答案:

答案 0 :(得分:0)

好的,经过大量挖掘后,asp:Panel没有实现INamingContainer,这就是Panel没有参与id命名约定的原因。

INamingContainer只是一个标记界面;它没有相关的属性或方法。

因此,如果您想要一个可以参与命名约定的Panel,您可以进行一些推导并使用它:

public class NamingPanel : Panel, INamingContainer
{...}