集成环境:Visual Studio 2010
.net版本:3.5
操作系统:Windows 7
网络服务器:Visual Studio 2010 开发服务器
下面是一些 asp.net C# 代码。这是开箱即用的空白 Web 表单背后的代码。我不明白的是为什么当我单击按钮时 testClick 事件没有触发,但如果我注释掉以下行以便在回发时呈现该按钮,它会触发。
if (!IsPostBack)
显然它与页面生命周期以及如何/何时呈现控件有关,但我不明白。当页面回发时,btnTest 按钮不是 btnTest 的新实例吗?为什么页面在回发后关心它是否真的存在?事件处理程序存在。看来这应该是最重要的事情。我希望有人可以打破事情发生的顺序并向我解释这种(显然是正确的和有意的)行为。
感谢阅读。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
Button btnTest = new Button();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
btnTest.Text = "TEST";
this.Form.Controls.Add(btnTest);
btnTest.Click += new EventHandler(testClick);
}
}
protected void testClick(Object sender, EventArgs e)
{
Response.Write("Test button event has been handled");
}
}
好吧,现在我完全糊涂了!在下面的代码中,btnTest 和 btnTest2 不是同一个按钮。当页面回发时,它会触发 btnTest2 的事件处理程序,就好像 btnTest2 被单击,但 btnTest2 未被单击。 btnTest 是。我不明白这种行为。我已阅读页面生命周期文章 https://msdn.microsoft.com/en-us/library/ms178472(v=vs.80).aspx正如所建议的那样,但我认为它不足以解释这种行为。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Button btnTest = new Button();
btnTest.Text = "TEST";
this.Form.Controls.Add(btnTest);
btnTest.Click += new EventHandler(testClick);
}
if (IsPostBack)
{
Button btnTest2 = new Button();
btnTest2.Text = "TEST";
this.Form.Controls.Add(btnTest2);
btnTest2.Click += new EventHandler(testClick_Postback);
}
}
protected void testClick(Object sender, EventArgs e)
{
Response.Write("Test button event has been handled by original handler");
}
protected void testClick_Postback(Object sender, EventArgs e)
{
Response.Write("Test button event was handled by new handler assigned on postback");
}
}
最佳答案
因为该代码仅在请求不是回发时才执行,因此未创建控件且未附加事件处理程序。要么将控件(和事件处理程序)放在标记中,要么在每个 请求上添加/附加它,而不仅仅是非回发。
控件及其事件不会跨请求持续存在——它们要么从标记中创建,要么在代码隐藏中创建。当您执行回发时,页面上不存在该控件,因此不会触发任何事件。
关于c# - 为什么 EventHandler 在以下 asp.net 代码中不触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30600576/