c# - 为什么 EventHandler 在以下 asp.net 代码中不触发?

标签 c# asp.net

集成环境: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/

相关文章:

c# - asp.net c#如何处理null?

c# - ffmpeg 无法识别

c# - 在类里面使用 session

c# - 为什么我会在 c# 中两次调用 previewKeyDown() 函数

c# - 如何使用其应用程序打开文件(该文件不存在于网络服务器中)?

c# - ASP.NET C# 外部 SDK 不是线程安全的

javascript - 在 asp.net 中使用 updatePanel 后,DropDownList 丢失其属性

c# - 如何使用AE.Net.Mail获取PlainText或HTML文本?

c# - 如何避免多次 if null 检查

asp.net 处理 iframe 内的异常