0

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

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

谁能解释为什么?

4

4 回答 4

4

@Brad:您的答案不完整;在 Page_Load 事件期间,他很可能在页面生命周期中做得太晚了。

好的,这就是你所缺少的。

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

当用户单击按钮时,该事件连同其他信息(如隐藏的视图状态字段)一起被发送回服务器。

在服务器端,ASP.NET 确定处理请求的页面,并从头开始重建页面。根据 .aspx 页创建和链接服务器控件的新实例。一旦重新组装,就会评估回发数据。视图状态用于填充控件,并触发事件。

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

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

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

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

于 2008-09-03T21:09:30.800 回答
2

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

于 2008-09-03T20:53:25.190 回答
1

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

  1. 使用按钮创建页面并附加事件处理程序
  2. 单击按钮,导致回发
  3. 在回发时, page_load 事件会因为您的 !IsPostback 语句而跳过事件处理程序的附加
  4. 此时,按钮没有事件处理程序,因此单击它不会触发您的事件
于 2008-09-03T20:57:56.660 回答
0

那是因为发生的事件绑定需要被翻译成 HTML。如果绑定到 OnInit 和 OnLoad 之间的页面,则会发生此回发。因此,如果您希望按钮正确绑定事件,请确保您在 OnInit 中完成工作。

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

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

于 2008-09-03T20:54:53.750 回答