ASP.NET动态用户控件ID生成问题

3
我遇到了一个问题,动态加载的UserControls的ID属性在页面生命周期中发生了变化。具体来说,在系统调用Page.Form.RenderControl(htmlTextWriter)之前,控件的ID为“ ctl84”,但在调用之后,它的ID变成了“ ctl99”。
htmlTextWriter的输出包含原始ID,但在VS 2008调试器中检查控件的ID属性时发现它已经更改。
应用程序运行在MCMS 2002(Microsoft CMS 2002)框架中,使用.NET 2.0,从1.1转换而来,且未启用xhtmlConformance =“ Legacy”。
我需要ID在整个页面生命周期中保持不变。
编辑:手动设置ID属性不是选项。
4个回答

1

你是否在代码中显式地为控件分配了ID?

如果是的话,ID应该保持不变。

虽然它没有解释为什么会改变 - 我猜测...不是同一个控件。很有可能由于某种原因,你的控件生成程序运行了两次或类似的操作。

在生成控件的位置设置断点,看看它是否被触发了两次 - 如果是,那就是你的问题所在。


我没有给控件分配任何ID,我故意让ASP.NET来分配ID。 - jamaicahest
你这样做有什么原因吗?在控制生成的地方设置断点,看看它是否被触发了两次——如果是,那就是你的问题。 - JohnIdol
是的,这是因为它们是从MCMS系统加载的,您可以通过编辑器向虚拟页面添加一堆控件,然后让系统找出如何呈现它。 - jamaicahest
所以你不能在控件生成的地方设置断点吗? - JohnIdol
是的,我有,并且它只在页面生命周期中被调用一次。然而,进一步挖掘后,我发现在Page.Form.RenderControl返回后,在调试器监视器中ID属性显示为null,直到我访问ClientID或UniqueID之一,此时它会更改为“ctl99”。 - jamaicahest
经过更深入的挖掘,我发现在渲染期间,CMS系统将UserControl添加到标签中,进行渲染,清除标签的Controls集合,这导致ID属性发生变化。现在我只需要找到一个解决方法 :) 感谢您的帮助。 - jamaicahest

0

为确保是同一个控件实例而非其他,可以检查控件的GetHashCode()方法。


GetHashCode()在Page.Form.RenderControl()之前和之后返回相同的数字。 - jamaicahest

0
当您包含一个asp.net控件时,运行时生成的ID会发生变化。您无法预测生成的确切客户端ID。您可以使用用户控件提供的ClienID属性。
Button btnSave = new Button();
btnSave.ID = "btnSave";
string clientID = btnSave.ClientID;
如果您检查cientID,它将类似于“ctl88_99_***_btnSave”。

客户端ID也会改变,问题在于ID在页面生命周期中发生了变化。而不是在回发或页面重新加载时发生变化。 - jamaicahest
PostBack 是页面生命周期的一部分。 - JohnIdol
我同意客户端ID更改。使用客户端ID的目的是执行操作而不是硬编码客户端ID。我猜你正在尝试从客户端访问控件。在这种情况下,在页面末尾使用隐藏变量,并将值设置为ASP控件的客户端ID。 - rAm

0

是的,我认为rAm是正确的。在我的以往经验中,我注意到显式id值始终有效,并建议使用相同的方法。安迪


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接