代码之家  ›  专栏  ›  技术社区  ›  Laurence

ASP.NET按钮单击未捕获(在转发器中动态加载的用户控件中的按钮)

  •  0
  • Laurence  · 技术社区  · 14 年前

    我编写了一个用户控件,它捕获一些用户输入,并有一个保存按钮将其保存到数据库。我使用转发器呈现页面上的许多控件-想象一个多选项问题列表,每个问题都有一个保存按钮。

    我正在将用户控件加载到中继器的itemdatabound事件中,如下所示(代码简化):

    Protected Sub rptAssignments_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptAssignments.ItemDataBound
    
        Dim CurrentAssignment As Assignment = DirectCast(e.Item.DataItem, Assignment)
        Dim ctl As UA = CType(LoadControl("~\Controls\UA.ascx"), UA)
    
        ctl.AssignmentID = CurrentAssignment.AssignmentID
        ctl.Assignment = CurrentAssignment.AssignmentName
        ctl.EnableViewState = True
    
        e.Item.Controls.Add(ctl)
    End Sub
    

    仅供参考,我需要在运行时加载控件,而不是在itemtemplate中指定它,因为每一行可以使用不同的控件。

    在用户控件中,有一个这样的链接按钮:

    <asp:LinkButton ID="lbnUpdate" runat="server" Text="Update" OnClick="lbnUpdate_Click" />
    

    …一个按钮点击处理程序如下:

    Protected Sub lbnUpdate_Click(ByVal sender As Object, ByVal e As EventArgs) Handles lbnUpdate.Click
       ' my code to update the DB
    End Sub
    

    问题是,单击“保存”按钮时,页面会回发,但不会调用lbnupdate_click。但是,调用页面本身的页面加载事件。

    我应该提到转发器是用户控件的一部分,用户控件加载在另一个用户控件中(这是一个大量使用用户控件的DotnetNuke站点)。保存按钮链接如下:

    javascript:__doPostBack('dnn$ctr498$AssignmentsList$rptAssignments$ctl04$ctl00$lbnUpdate','')
    
    3 回复  |  直到 14 年前
        1
  •  2
  •   BC.    14 年前

    这个问题举例说明了WebForms是如何超越自身的。

    您必须通过重新绑定或从ViewState重新构造中继器,以使子控件引发事件。您所支付的价格要么是到数据源的另一次访问,要么是在视图状态下存储在客户机上的所有冗余数据。可耻!

        2
  •  1
  •   Andy_Vulhop    14 年前

    我曾经也遇到过类似的问题,可能是同样的事情。

    简而言之,由于您正在动态创建按钮,因此在回发之后 它们不存在 . 因此,当ASP.NET WebForms查找事件时,它找不到任何内容。

    你的中继器什么时候被数据绑定?尝试在回发中再次将按钮呈现到页面上(甚至作为测试),以查看这是否起作用。

        3
  •  0
  •   Tim Schmelter    14 年前

    每次回发时,用户控件的ID是否相同?