为我的自定义 ASP.net 服务器控件生成的 HTML 代码生成子控件的 name 属性,而不是 id 属性。像这样的东西:
<span id="GridView2_ctl02_editdis">
<input type="text" name="GridView2$ctl02$editdis$ctl00"/>
</span>
自定义控件本身的 ID 显然是正确的。
对我来说更奇怪的是 ID 确实是生成的有时(我不知道在什么条件下)。但一个FindControl()
使用该 ID 在服务器端返回 null。FindControl()
与 name 属性的值一起工作就很好。
像这样的东西:
<span class="TextBox" id="GridView2_ctl02_editdis">
<input type="text" id="GridView2_ctl02_editdis_ctl00" name="GridView2$ctl02$editdis$ctl00"/>
</span>
对于上述情况,FindControl("GridView2$ctl02$editdis$ctl00")
工作正常,FindControl("GridView2_ctl02_editdis_ctl00")
没有。
如何确保 ID 一致且可预测?
他们是一致的。
在内部,作为命名控件(即 GridView)的子控件的完整 ID 是通过使用“$”附加其父控件的 ID 来构建的。如果是网格,则为 gridID$rowID$cellID$mycontrolID。这是区分同一子控件(即 mycontrolID)的多个实例所必需的。为什么是“$”而不是“_”?我想是因为很多人已经倾向于将他们的控件命名为“my_control_something”,并且“$”符号与任何符号一样好。
因此,GridView2$ctl02$editdis$ctl00 是正确的 ID,这就是为什么它被用作 INPUT 等控件的名称。当发生回发时,框架需要能够将表单键与适当的控件相匹配。
我认为,ID 的混淆来自于这样一个事实:您在 .aspx 中使用的 ID 和您在 HTML 中看到的 ID 是两个不同的东西。客户端 ID 就是这样。无论出于何种原因,当呈现控件时(使用 ClientID 属性),所有“$”都会被“_”替换。我的猜测是这样做是为了使其对 javascript/css 友好。
现在,关于 FindControl("GridView2$ctl02$editdis$ctl00")... 您确实应该尽可能避免它。 FindControl 是一个递归函数,它将“GridView2$ctl02$editdis$ctl00”分解为“GridView2”和“ctl02$editdis$ctl00”,找到 GridView2 并询问它是否有“ctl02$editdis$ctl00”作为子控件。对以 $ 分隔的每个部分重复该过程。
附带说明一下,每当您发现自己为某些深埋的控件调用 Page.FindControl 时,您都需要检查该模式并询问原因。例如,无论需要使用“GridView2$ctl02$editdis$ctl00”做什么,很可能也需要使用“GridView2$ctl02$editdis$ctl01”来完成。在这种情况下,可能需要在 OnItemCreated 或 OnItemDataBound 上处理,您可以在其中访问“了解”“ctl00”的行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)