0

我有一个正在处理的大型 asp.net 项目(ASP.NET 的新手),我遇到了一些动态添加的按钮在第一次点击时没有触发其点击事件的问题。奇怪的是,这并不总是发生。有时它们在第一次单击时工作得很好,有时如果我运行项目并遵循完全相同的步骤,则按钮在第一次单击时将不起作用。

这里有一些背景...

有问题的页面用于将某些内容的不同版本部署到客户端。该页面有一个包含一堆表格的 UpdatePanel,并且在任何给定时间只有其中一个是可见的。每个表代表一个类似向导的工作流的不同“屏幕”。因此,当页面加载时,第一个表是可见的,而其他所有表都不可见,并且第一页有一个带有部署类型的单选按钮列表和一个继续按钮。单击“继续”按钮时,会为下一个“屏幕”加载一些数据,第一个表不可见,下一个表可见。

所以现在你已经有了一些背景,关于这个问题......

其中一张表上有一个空的 Accordion,当点击前一个“屏幕”的 Continue 按钮时,Accordion 会动态填充来自 DB 的数据;每个主要版本都有一个窗格,每个窗格中都有一个表格,每个次要版本都有一行。这些行中的每一行都有版本号、部署状态和一个操作按钮,允许用户部署版本,或者如果它已经部署,他们可以重新部署。无论如何,这些操作按钮是我遇到的问题,有时它们在第一次单击时不起作用。就像我说的,按钮是在前一个“屏幕”上的继续按钮的单击事件中创建的,我设置了每个按钮的 ID,并将事件链接到创建按钮时的单击事件。我可以对此进行调试并看到添加的事件处理程序没有问题,但是当我第一次单击按钮时(这实际上并不一致;有时它们第一次工作!)他们什么也没做,但是在第二次单击时,它们可以正常工作。我有一个名为 populateAccordion() 之类的方法,它负责从数据库中实际加载数据并使用其中的按钮创建这些记录。如果它是回发,我会在 page_load 上调用此方法,但前提是来自先前“屏幕”的缓存选择不为空(即,我在先前的“屏幕”上缓存了 subjectId 和 centerId,并且仅在它们不为空时加载 Accordion 数据) . 有时他们第一次工作!)他们什么都不做,但在第二次点击时他们正常工作。我有一个名为 populateAccordion() 之类的方法,它负责从数据库中实际加载数据并使用其中的按钮创建这些记录。如果它是回发,我会在 page_load 上调用此方法,但前提是来自先前“屏幕”的缓存选择不为空(即,我在先前的“屏幕”上缓存了 subjectId 和 centerId,并且仅在它们不为空时加载 Accordion 数据) . 有时他们第一次工作!)他们什么都不做,但在第二次点击时他们正常工作。我有一个名为 populateAccordion() 之类的方法,它负责从数据库中实际加载数据并使用其中的按钮创建这些记录。如果它是回发,我会在 page_load 上调用此方法,但前提是来自先前“屏幕”的缓存选择不为空(即,我在先前的“屏幕”上缓存了 subjectId 和 centerId,并且仅在它们不为空时加载 Accordion 数据) .

这对于发布代码来说有点太复杂了,但是有没有人知道可能出了什么问题,或者我怎么能解决这个问题?我已经做了很多调试,并且我的 populateAccordion() 总是在前一个屏幕的 Continue 按钮单击以及之后的每个 page_load 上正确调用,并且 Click 事件总是在创建按钮时正确连接方法,所以我无法弄清楚为什么点击事件不会在第一次尝试时触发。

问题与本文中提到的问题相似...

https://stackoverflow.com/a/2784140/1246574

但我肯定会为我的所有按钮设置 ID,因此该帖子中提到的解决方案不能解决我的问题。

我还阅读了很多其他帖子,这些帖子说将您的代码从 Page_Load 移动到 Page_PreRender,但在这种情况下这并没有改变任何东西;它的作用完全相同。

我还尝试设置按钮的 UseSubmitBehavior = false,但没有运气。

谢谢!

4

1 回答 1

0

这可能是一个延迟问题。听起来您可以在页面完全加载所有 JS 之前单击控件。那里有 onload() 函数吗?也许您可以尝试隐藏控件直到页面完成加载?

于 2012-11-29T01:18:07.387 回答