在动态添加UserControl到UpdatePanel时,具有相同ID的服务器控件中的错误状态

这是我想要做的。 我有一个带有两个链接按钮和一个updatepanel的页面(两个链接按钮触发updatepanel)。 我有两个usercontrols,其标签具有相同的ID。 当我单击第一个链接按钮时,我将第一个usercontrol添加到updatepanel并将标签值设置为datetime.now

当我点击第二个链接按钮时,我添加了第二个用户控件但我看到第一个控件中的标签值是在第二个用户控件的标签中设置的。 如果id不同则没有问题 – 但在我的情况下,用户控件是由不同的团队开发的,我按照我提到的方式集成它们 – 所以他们可能有相同的ID。

我已经浏览了所有并尝试了各种建议,但我不能让这个工作,任何帮助将不胜感激。

谢谢

乔布埃尔

实际上,你的问题与UpdatePanel无关。

想象一下如果你有一个第三个LinkBut​​ton会发生什么,它除了回发之外什么也没做。 如果您单击第一个LinkBut​​ton,UserControl出现,然后您单击第三个会发生什么? 你期待看到什么? 如果您认为您将再次看到UserControl,那么您错了。 必须在每次请求时创建动态创建的控件,它们不会自动停留。 ViewState会记住页面上的控件状态,而不是控件本身的状态 – 这就是aspx页面中的标记。 动态创建的控件显然不在标记中,因此它们不会自动重新创建。

您需要将控件的生命周期视为两个请求之间的“跨越”。 它从一个请求的一半开始,到下一个请求的一半结束。 您需要保存当前显示在隐藏字段或Page.ViewState值中的用户控件(不是用户控件本身提醒您,只需要您想出的任何信息),然后从页面的OnLoad重新加载该控件。 如果你这样做 – 序列将如下所示:

(1)单击LinkBut​​ton1(2)UserControl1动态创建(3)单击LinkBut​​ton2(4)Page.OnLoad重新加载UserControl1(5)UserControl1加载其回发数据和viewstate(6)LinkBut​​ton2的click事件触发(7)删除现有的UserControl1并添加UserControl2动态(8)UserControl2可以具有相同的ID,因为UserControl1已经“消耗”了它的状态。

我建议你浏览我在ASP.NET中理解动态控件的系列文章: http : //weblogs.asp.net/infinitiesloop/

创建用户控件时,必须为标签设置不同的ID。