无法让我的活动开火

时间:2008-09-03 20:51:49

标签: asp.net

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

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

任何人都可以解释原因吗?

4 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

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

您希望在解析ViewState信息并将其添加到控件之前加载控件,并在控制事件触发之前加载控件,因此您需要处理PreInit事件并在此时添加按钮。同样,每次加载页面时都必须这样做。

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

答案 1 :(得分:2)

您需要添加按钮,不仅仅是非回传。

答案 2 :(得分:1)

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

  1. 使用按钮创建页面并附加事件处理程序
  2. 单击
  3. 按钮,导致回发
  4. 在回发时,page_load事件会跳过事件处理程序的附加,因为您的!IsPostback语句
  5. 此时,按钮没有事件处理程序,因此单击它不会触发事件

答案 3 :(得分:0)

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

请参阅Page Life Cycle解释。

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