我有以下情况:
UserControlA
包含一个<asp:Button id="bSomeid" onClick="AddItem" />
,其中包含AddItem
中购物篮中商品的一些代码。UserControlB
包含一些LinkButton
个动态添加UserControlA
选项OnClick
事件中的页面。这都是在UpdatePanel
中完成的。这有点复杂,但我已将信息修剪为我认为导致问题的信息,如有必要,我会添加更多信息。
我遇到的问题是,在点击AddItem
后将项目添加到页面后,LinkButton
事件需要点击2次才会触发。
我理解为什么会发生这种情况 - 在页面循环的后期为onclick中的下一篇文章注册事件 - 但是有人能想到解决这个问题吗?我可以强制在下一次回发时触发事件吗?我试图想办法在page_load
中运行我的代码,但我需要访问sender
中的onClick
。
使用.NET 4.0。
修改
我设法找到一种方法来获取链接按钮在Page_Load中发送请求(使用Request.Form["__EVENTTARGET"];
),因此我将代码移至Page_load
事件。它仍然需要2次点击,所以我假设它与onClick注册到很晚没什么关系。
是否还有其他一般要检查的内容可能导致按钮需要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,因此它也可能对我有所帮助。你有一个带有触发事件的文本框吗?我这样做,如果我把它留空(这样它不会触发),那么就不需要再次点击了。