无法触发我的活动
首次加载页面时(!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...。