【问题标题】:asp.net button event not firingasp.net 按钮事件未触发
【发布时间】:2013-08-09 19:44:03
【问题描述】:

我有问题。当我将事件处理程序从后面的代码添加到按钮时,该事件永远不会被触发。但是当我从创建按钮标签时添加它时,它可以完美运行,我正在从后面的代码创建按钮并将其添加到表中。

<form id="form1" runat="server">
    <div>                       
        <asp:Button ID="Button1" runat="server" Text="show table" OnClick="Button1_OnClick" />
        <table border="1">
            <thead>
                <tr>
                </tr>
            </thead>
            <tbody id="tbody" runat="server">

            </tbody>
        </table>
    </div>
</form>


protected void Button1_OnClick(object sender, EventArgs e)
{
  var row = new TableRow(); 
  var btnDownload = new Button { ID = "ID", Text = "Click Here" };
  btnDownload.Click += ClickEvent;
  var cell = new TableCell();
  cell.Controls.Add(btnDownload);
  row.Controls.Add(cell);
  tbody.Controls.Add(row);
}
protected void ClickEvent(object sender, EventArgs e)
{
  Debug.WriteLine(((Button)sender).Text);
}

【问题讨论】:

    标签: asp.net events code-behind buttonclick


    【解决方案1】:

    这个问题的答案在于了解 ASP.NET 页面生命周期。 ASP.NET 在回发时重建页面的服务器实例。一旦服务器完成处理并将响应发送回客户端,服务器实例将被永久销毁,并且只能使用浏览器中包含的数据(查看数据/cookies等)和剩余的服务器数据(会话/缓存)。

    您正在 Button1_OnClick 事件处理程序中连接动态按钮的单击事件。当 ASP.NET 尝试在下一次回发时重建页面时,它不会运行此事件处理程序(因为未单击 Button1),因此事件处理程序将永远不会被连接,这解释了为什么它永远不会运行。您需要在 Page_Load 处理程序中或之前连接任何事件处理程序,以便捕获控制事件处理程序。

    【讨论】:

    • 我打算使用Jquery ajax 实现客户端事件要容易得多。
    • 这可能是一个更好的选择。如果您有选择,我还建议使用 ASP.NET MVC 框架(或类似框架)进行任何新的开发,以支持 Web 窗体。现在已经过时了(这是个人意见)。
    • 我肯定会学习和使用 ASP.NET MVC,因为它比较新而且 Web 表单很烂,谢谢
    【解决方案2】:

    请不要接受这个作为答案,chappoo回答了你的问题。

    由于一个事件被触发一次,您的控件将只存在一次,并在下一次PostBack 时消失。您不应该在 PostBack 事件中创建/删除控件。 Dynamic server controls must be created during the Init of the page.

    以下是一些了解 ASP.NET 和 ASP.NET MVC“生命周期”的链接。

    ASP.NET

    您可以看到在页面的Load 期间必须存在任何控件,以引发控件事件(RaiseChangedEvents)和回发事件(RaisePostBackEvent)。例如,页面子控件和控件子控件在页面Load 之后创建(CreateChildControls)、数据绑定(OnPreRender 之后)和渲染(RenderControl)。有时,一些开发者会调用页面Load中的EnsureChildControls来预加载子控件。

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

    ASP.NET MVC

    “生命周期”纯粹用于请求处理。动作(控制器)独立于渲染(视图)。

    ASP.Net MVC - Request Life Cycle

    http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/entrypage/be-ahead-of-the-game-poster1

    【讨论】:

    • 感谢您提供如此好的解释和分享信息链接。
    猜你喜欢
    • 2013-07-02
    • 2016-08-02
    • 1970-01-01
    • 2010-10-21
    • 2011-12-02
    • 1970-01-01
    • 2020-05-01
    • 2010-12-19
    • 2014-01-14
    相关资源
    最近更新 更多