IDE:Visual Studio 2010
.net版本:3.5
操作系统:Windows 7
Web服务器: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"); } }