没有捕获ASP.NET按钮单击(在Repeater中动态加载的用户控件中的按钮)

时间:2010-06-04 23:25:44

标签: asp.net user-controls repeater loadcontrol itemdatabound

我编写了一个用户控件来捕获一些用户输入,并有一个Save按钮将其保存到DB。我使用转发器在页面上渲染了许多这些控件 - 想象一下每个问题都有一个“保存”按钮的多项选择问题列表。

我在转发器的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。但是,会调用页面本身的Page_Load事件。

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

javascript:__doPostBack('dnn$ctr498$AssignmentsList$rptAssignments$ctl04$ctl00$lbnUpdate','')

3 个答案:

答案 0 :(得分:2)

这个问题举例说明了网络形式如何超越自我。

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

答案 1 :(得分:1)

我有一个类似的问题,可能是同样的事情。

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

您的转发器何时获得数据绑定?尝试在回发中再次将按钮渲染到页面(即使作为测试),看看是否有效。

答案 2 :(得分:0)

每次回发时UserControl的ID是否相同?