ASPX Webform - 以编程方式创建的链接按钮从不触发 UpdatePanel 中的事件

ASPX Webform - Programmatically created linkbutton never trigger event in UpdatePanel

我有一个带有 MasterPage 的简单测试应用程序,一个 Default.aspx 页面包含一个带有几个 html 和 asp 控件的 UpdatePanel。

我的目的是动态创建控件和绑定事件。

我知道有关控件 ID 和绑定事件处理程序的问题,因为您需要向脚本管理器注册一个 asynccontrol。

我尝试了很多东西,但我动态创建的链接按钮进入了 PostBack,在 MasterPage 中 on_load 但从来没有出现在我附加的点击事件中。

额外信息: 声明式 asp 按钮在 Default.aspx Page_Load 并执行回发后触发其点击事件,LinkBut​​ton 动态创建在默认 Page_Load 中也一样,但永远不会触发 btnTest_Click2。此应用程序基于 .NET 4.5 (Visual Studio 2015)。

有什么想法吗?

谢谢。

Default.aspx :

<%@ Page Title="Home Page" Language="VB" MasterPageFile="~/Site.Master" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="TestUpdatePanel._Default" %>

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
    <h1>This will never change !</h1>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            <asp:Button runat="server" ID="btnTest" CssClass="btn btn-success" OnClick="btnTest_Click" Text="Hit me hard !" />
        <div runat="server" id="testDiv">
            <p>Hello this a test</p>
        </div>            
        </ContentTemplate>
        <Triggers>
        </Triggers>
    </asp:UpdatePanel>   

</asp:Content>

Default.aspx.vb 代码隐藏:

Public Class _Default
    Inherits Page

    Dim currentsm As ScriptManager

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

        currentsm = CType(Page.Master.FindControl("sm1"), ScriptManager)

        If Not IsPostBack Then
            MsgBox("It's not a postback", MsgBoxStyle.DefaultButton1)
        Else
            MsgBox("It's a Postback !", MsgBoxStyle.DefaultButton1)
        End If


    End Sub

    Protected Sub btnTest_Click(sender As Object, e As EventArgs)

        BuildButton()

    End Sub

    Private Sub BuildButton()

        Dim link = New LinkButton

        link.ID = "linkTest"
        link.ClientIDMode = ClientIDMode.Static
        link.Text = "This is a new Ajax link :-)"

        AddHandler link.Click, AddressOf btnTest_Click2

        Dim trigger As AsyncPostBackTrigger = New AsyncPostBackTrigger
        trigger.ControlID = link.ClientID
        trigger.EventName = "Click"
        UpdatePanel1.Triggers.Add(trigger)

        currentsm.RegisterAsyncPostBackControl(link)

        testDiv.Controls.Add(link)
        UpdatePanel1.Update()

    End Sub

    Private Sub BuildDiv()

        Dim divToCreate = New HtmlGenericControl

        divToCreate.TagName = "div"
        divToCreate.ID = "newDiv"
        divToCreate.ClientIDMode = ClientIDMode.Static
        divToCreate.Attributes("class") = ("btn btn-alert")
        divToCreate.InnerText = "It works !"

        testDiv.Controls.Add(divToCreate)

        UpdatePanel1.Update()

    End Sub


    Protected Sub btnTest_Click2(sender As Object, e As EventArgs)

        BuildDiv()

    End Sub

我终于通过使用 OnInit 事件来实例化动态创建的控件,如下所示:

Protected Overrides Sub OnInit(e As EventArgs)
    MyBase.OnInit(e)
    If IsPostBack Then
        currentsm = CType(Page.Master.FindControl("sm1"), ScriptManager)
        Dim sender = Request.Form("__EVENTTARGET").ToString
        If sender.Contains("btnTest") Then
            BuildButton()
        ElseIf sender.Contains("linkTest") Then
            BuildDiv()
        End If
    End If
End Sub