无法触发我的活动

时间:2020-03-05 18:47:17  来源:igfitidea点击:

首次加载页面时(!IsPostback),我在代码中创建一个按钮并将其添加到页面中,然后将事件处理程序添加到click事件。

但是,当单击按钮时,页面重新加载后,我的事件处理程序不会触发。

谁能解释为什么?

解决方案

回答

我们需要始终添加按钮,而不仅仅是非回发。

回答

这是因为发生的事件绑定需要转换为HTML。如果绑定到OnInit和OnLoad之间的页面,则会发生这种回发。因此,如果我们希望按钮绑定事件正确,请确保我们在OnInit中完成工作。

请参见页面生命周期说明。

http://msdn.microsoft.com/en-us/library/ms178472.aspx

回答

如果我们不是在每次回发时都重新添加事件处理程序,则该按钮的事件将不存在。我们需要首先确保每次刷新页面时都添加事件处理程序。因此,这是我们页面的事件顺序:

  • 使用按钮创建页面并添加事件处理程序
  • 单击按钮,导致回发
  • 在回发时,由于!IsPostback语句,page_load事件会跳过事件处理程序的添加
  • 此时,该按钮没有事件处理程序,因此单击它不会触发事件

回答

@布拉德:答案还不完整;他很可能在Page_Load事件期间在页面生命周期中做得太晚了。

好的,这就是我们所缺少的。

ASP.NET是无状态的。这意味着,在呈现页面并将其发送到浏览器之后,页面对象及其上的所有内容都会被销毁。在该页面和用户浏览器之间没有链接保留在服务器上。

当用户单击按钮时,该事件将与其他信息(如隐藏的viewstate字段)一起发送回服务器。

在服务器端,ASP.NET确定哪个页面处理请求,然后从头开始重建页面。服务器控件的新实例将根据.aspx页创建并链接在一起。重新组装后,将评估回发数据。 viewstate用于填充控件,并触发事件。

所有这些都以特定的顺序发生,称为页面生命周期。为了在ASP.NET中做更复杂的事情,例如创建动态控件并将它们添加到运行时,将它们添加到网页中,我们必须了解页面生命周期。

对于问题,我们必须在页面每次加载时都创建该按钮。此外,我们必须在该页面上触发事件之前创建该按钮。在Page_Load和Page_LoadComplete之间触发控件事件。

我们希望在解析ViewState信息并将其添加到控件之前以及在控件事件触发之前加载控件,因此我们需要处理PreInit事件并在此时添加按钮。同样,每次页面加载时都必须执行此操作。

最后一点;页面事件处理在ASP.NET中有点奇怪,因为事件是自动连接的。请注意,Load事件处理程序称为Page_Load...。