OnClick中添加的CustomControl中的按钮在第二次单击之前不会回发

时间:2013-01-08 08:24:48

标签: asp.net .net updatepanel postback

我有以下情况:

  1. UserControlA包含一个<asp:Button id="bSomeid" onClick="AddItem" />,其中包含AddItem中购物篮中商品的一些代码。
  2. UserControlB包含一些LinkButton个动态添加UserControlA选项OnClick事件中的页面。
  3. 这都是在UpdatePanel中完成的。这有点复杂,但我已将信息修剪为我认为导致问题的信息,如有必要,我会添加更多信息。

    我遇到的问题是,在点击AddItem后将项目添加到页面后,LinkButton事件需要点击2次才会触发。

    我理解为什么会发生这种情况 - 在页面循环的后期为onclick中的下一篇文章注册事件 - 但是有人能想到解决这个问题吗?我可以强制在下一次回发时触发事件吗?我试图想办法在page_load中运行我的代码,但我需要访问sender中的onClick

    使用.NET 4.0。

    修改

    我设法找到一种方法来获取链接按钮在Page_Load中发送请求(使用Request.Form["__EVENTTARGET"];),因此我将代码移至Page_load事件。它仍然需要2次点击,所以我假设它与onClick注册到很晚没什么关系。

    是否还有其他一般要检查的内容可能导致按钮需要2次点击才能正确发布事件?

2 个答案:

答案 0 :(得分:0)

如果您对页面生命周期迟到的怀疑是真的,那么您可以尝试使用ScriptManager.RegisterAsyncPostBackControl方法在链接按钮单击中注册动态添加的控件 - 考虑到您的按钮在用户控件内,您需要添加实际注册按钮UserControlA的{​​{1}}公共方法和bSomeid1中的链接按钮点击实际上会调用A控件的方法。

编辑

没有发生按钮点击的另一个原因可能是当回发发生时,页面层次结构中没有添加动态控件的按钮(或者当已经处理回发数据时,它在页面生命周期中很晚才被添加) 。一个真正完全证明的解决方案应该将动态控件添加回UserControlB它自身的页面层次结构(并在层次结构中严格维护相同的控件ID)。如果那是不可能的,那么你可以嗅探请求(page_load)以检测回发。

在您的情况下,您应该确定按钮是否确实导致每次点击后回发。如果是,第一个请求的POST数据(Request.Form)是什么 - 第一次点击(和回发后)的__EVENTTARGET值是多少?那应该开始你的麻烦了。

另一方面,一个简单的解决方法可能是使用html锚元素(你仍然可以使用链接按钮)并在click事件中有一个javascript处理程序,它会设置一些隐藏变量,然后提交表单(你可以模拟单击隐藏按钮以触发ASP.NET客户端提交管道)。现在可以在回发后使用隐藏变量值来确定单击了哪个链接按钮。

答案 1 :(得分:0)

  

&#34;还有其他一般要检查的事项可能导致按钮需要2次点击才能正确发布事件吗?&#34;

是否需要在控件上单击两次,或者是否接受单击屏幕上的其他位置,然后只需单击控件即可第一次点击?

我在Updatepanel上有自己的(类似)问题,其中第一个(预期的)触发器没有触发,似乎只需单击其他地方,然后后续触发器首次触发(总共2次点击)

[edit]由于您正在使用此ATM,因此它也可能对我有所帮助。你有一个带有触发事件的文本框吗?我这样做,如果我把它留空(这样它不会触发),那么就不需要再次点击了。