找到具有相同ID“add0”的多个控件。 FindControl要求控件具有唯一ID

时间:2009-04-02 14:33:07

标签: asp.net dynamic controls page-lifecycle

以前调用:如何在aspx

中加载动态创建的控件

回答以下问题:确定要还原的控件所需的信息包含在专用的视图状态对象中。

我在代码隐藏页面中动态创建控件 - 这些控件都连接到单击处理程序,因此当发生回发时,我必须重新创建上一组控件,然后清除控件并生成新的控件集基于之前的点击。

这在正常情况下编码并正常工作,如下所示:

in Page_Load
if not postback generate default buttons 
else if postback re-generate buttons that were shown on last page

in click_handler
Clear the dynamically generated buttons created in the Page_Load
generate new buttons based on the specific click being handled

然而,当服务器负载不足时,我们开始遇到问题:

每秒有5个用户,我们开始获得异常: 找到了具有相同ID“add0”的多个控件。 FindControl要求控件具有唯一ID。

每秒有100个用户,我们开始获得异常: 在DataBind,Init,Load,PreRender或Unload阶段无法修改控件集合。

一旦发生这种情况,所有后续请求都会出现相同的错误,并且必须重新启动IIS。

导致这种情况的原因是什么,我该如何避免呢?在加载时,html请求是否可能会覆盖并相互干扰?在页面卸载之后以某种方式处理对象以允许下一页加载来跳过它们吗?

3 个答案:

答案 0 :(得分:2)

您如何存储有关需要还原的控件的信息?如果您正在使用ViewState或ControlState,那么我不会看到加载如何影响事物。这就是任何复合控​​件的工作方式。

我会说我在使用Infragistics UltraWebGrid时看到了你的第二个错误,但从来没有能够追踪它。从调用堆栈中,似乎在Load阶段(或者可能是LoadViewState)中调用了EnsureChildControls。

答案 1 :(得分:2)

私有静态变量用于存储名称和表格单元格的字典,以便在页面生命周期内不会重新创建表格单元格。

关键是它被标记为静态 - 它应该是一个实例变量 - 最终结果是当请求开始备份时加载,然后多个堆栈请求共享这个静态字典。

究竟发生了什么我不是100%肯定 - 但在中等负载下FindControl会发现多个相同名称的控件,在非常高的负载下似乎一个请求会尝试修改控件(可能添加到它),而它另一个请求处于无效状态。

最终结果 - 如果你真的不知道你在做什么 - 更喜欢实例变量sto静态变量。

答案 2 :(得分:0)

你写的所有内容似乎都是正确可行的。这很可能是您的控件生成代码的问题。也许如果你发布一些我们可以更好地找到解决方案。