2

作品:

protected void Page_Load(object sender, EventArgs e)
{
    myButton.Click += new EventHandler(myButton_Click);
}

不起作用:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        myButton.Click += new EventHandler(myButton_Click);
    }
}

现在,我在第二个示例中所期望的是事件处理程序仅在它不是回发时(即第一次加载页面时)才连接到按钮,然后在任何回发时,按钮将不再运行与事件关联的方法。情况似乎并非如此 --- 从第一次加载(不是回发)开始,按钮在单击时什么也不做。

我怀疑这与页面生命周期有关——但我不太确定这属于哪一种。如果我理解正确,与事件关联的方法会在页面回发后运行(即使您在页面第一次加载时单击它),但我指的是事件与方法的连接EventHandler 委托,而不是关联方法的实际运行。

注意:这纯粹是为了更好地了解幕后发生的事情,而不是试图解决现实世界的问题。

4

4 回答 4

1

您需要考虑每个页面请求如何执行代码。服务器上发生的情况是为每个请求创建一个类实例,如果代码行

myButton.Click += new EventHandler(myButton_Click);

是有条件的,这意味着事件处理程序在回发时未连接到事件。

换句话说,如果你写类似

<asp:Button ID="myButton" runat="server" OnClick="myButton_Click"  />

这转化为您编写的代码,并且事件与每个请求相关联。

于 2012-08-07T03:17:29.767 回答
0

如果不是回发,则表示用户只是通过在浏览器中键入 URL(或单击链接,或...)来请求页面(HTTP Get 请求)。

如果用户点击了一个按钮,那么浏览器会发出一个 HTTP Post 请求,在服务器端,ASP.NET 通过将页面对象的 IsPostBack 属性设置为 true 来标记所请求的页面。

请参阅此问题的答案。

于 2012-08-07T03:13:58.893 回答
0

问题是,事件处理程序只能在回发时触发。事件处理程序的连接仅影响该类的实例。当回发发生时,会创建一个新的页面实例,并且不再连接事件处理程序。您需要连接它才能触发它。

最好的办法是始终连接事件处理程序。没有理由不这样做。

于 2012-08-07T03:15:51.280 回答
0

我猜你打算做的是禁用回发按钮。您可以通过将 enabled 属性设置为 false 来做到这一点。

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        myButton.Enabled = false;
    }
}
于 2012-09-06T16:18:32.163 回答