为什么需要两次单击按钮控件?
我有一个使用VB和Ajax的Web应用程序。我正在使用updatepanels来避免在发回服务器时出现恼人的"闪烁"。
我想在updatepanel本身中定义一个按钮控件(试图将其移到外面并遇到一些灾难性的错误,因此将其留在此处),使当前面板不可见,而同级面板可见。除必须单击两次按钮外,此方法有效。不是双击,而是单击一次而不是再次单击。
在设置断点时,我发现按钮上所附的代码实际上是在第一次单击时执行的,但是面板没有按预期进行切换。如果单击相同的按钮或者更糟糕的是单击其他按钮,则会出现第二个面板的预期行为。但是,在单击第二个按钮的情况下,显示了第三个面板,这是不必要的奖励,由于单击了第二个按钮,因此使第三个面板可见。
我假设这种行为是由于updatepanel及其Ajax性质引起的。有没有办法避免第二次点击?我在滥用更新面板吗?我真的很想使用模式弹出窗口(就在AjaxToolKit中),但是在回发数据时遇到问题,因此我选择了这种方法。任何见识,帮助,甚至批评都将受到欢迎,因为这困扰了我足够长的时间。谢谢
解决方案
回答
如果我们摆脱了UpdatePanels,使用BackBacks是否可以正常工作?可能是Page_Load或者链中其他较高级别的事件在单击事件之前以某种方式"重置"了某些事件。可能是这样吗?
回答
我之前碰到过这个问题并解决了它,我只是不记得如何。我将尝试找到我的旧代码并与我们联系。一个想法,我们在脚本管理器中启用了EnablePartialRendering吗?也许尝试将两个容器都包装在第三个面板中。
回答
更新面板位于其他面板内。
那应该是另一回事吗? AFAIK仅更新面板中的控件将通过AJAX调用进行更新。
回答
我认为问题是该方法执行后,只有更新面板才从服务器接收数据。我们要更改的面板不在更新面板之外,因此它不知道其属性已更改。
我们或者需要做一整页的回发,或者要在更新面板中放置要修改的面板。
回答
这是一个相当简单的解决方案。 (今天早上我遇到了同样的问题。)
UpdatePanel无法在自身外部呈现内容。因此,正如我们所注意到的,更新正在进行中,但是我们没有看到结果。
最简单的解决方案是强制执行完整的回发。我们可以这样做:
protected override void OnInit(EventArgs e) { var scriptManager = ScriptManager.GetCurrent(this); // or this.Page in a UserControl, etc. scriptManager.RegisterPostBackControl(someButton); scriptManager.RegisterPostBackControl(someOtherButton); // etc. for each control that needs to update something outside the UpdatePanel }
这仍然允许按钮本身通过Ajax在UpdatePanel中进行更新(例如,将其状态更改为"禁用"或者"启用")。只有单击按钮,才会发生完整的回发。
回答
就像其他人所说的那样,更新面板仅更新其内容,这就是使用它的主要好处之一。
Panel2和pnlPrvCmt必须位于更新面板中,才能使按钮单击方法起作用。另一种选择是将Panel2放在一个更新面板中,将pnlPrvCmt放在另一个更新面板中。然后,只要UpdateMode = Always(默认为默认值),则任一更新面板中的任何控件都将导致两者刷新。