我会尽量在这里描述一下。我们有一些工作的代码,现在,没有被改变,不是。我已经解决了这个问题,所以情况如下:
我们有一个ASPX页面,上面有2个asp:Panel控件(Panel1和Panel2)。在每个面板中,都有一个WebUserControl(Panel1包含UserControl1,Panel2包含UserControl2)。这个页面上有AJAX工具包Scriptmanager,就是这样。当用户第一次访问页面时,会显示Panel1,并隐藏Panel2。
在UserControl1中,有一个asp:Panel,一个包含asp:UpdatePanel的asp:Label,里面是一个asp:Button。在后面的代码中,有一个委托和一个事件来引发它 - 当你点击按钮时会触发这个事件。在ASPX页面中有一个包含UserControl的事件处理程序。
在Panel2中有一个asp:UpdatePanel,asp:Panel和asp:Label
因此,在ASPX页面中,当您单击UserControl1中的按钮时,将处理该事件。然后,此事件处理程序隐藏Panel1并显示Panel2。至少那就是USED会发生的事情,但现在不会发生这种情况。
总结一下 - 首次访问时的ASPX页面显示Panel1和UserControl1。在UserControl1中有按钮,用户点击这会在ASPX页面中引发事件,这应该隐藏Panel1并显示Panel2。
如果从UserControl1和UserControl2中删除UpdatePanels,则代码可以正常工作。
显然,我们这里的'现实生活'代码更复杂 - 但这个小例子说明了问题所在。
以下是包含问题的zip:http://test.wikisaber.es/testajax.zip
答案 0 :(得分:2)
仅更新更新面板的内容。因此,您需要从panel1和panel2中删除更新面板,然后将panel1和panel2放在同一个更新面板中。
编辑:如果我们将default.aspx扩展为包含TestUserControl1,那么从您的示例中得到类似的内容:
<asp:Panel ID="panelUC1" runat="server" Visible="false">
<asp:Panel ID="panelUC1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="User Control 1...." />
</div>
<asp:UpdatePanel ID="updatePanel" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<!-- only the content in from here -->
<div>
<asp:Button ID="buttonNext" runat="server" OnClick="buttonNext_Click" Text="Click" />
</div>
<!-- to here will change when you click on buttonNext -->
</ContentTemplate>
</asp:UpdatePanel>
</asp:Panel>
</asp:Panel>
<asp:Panel ID="panelUC2" runat="server" Visible="false">
<tuc2:testUserControl2 ID="testUserControl2" runat="server" />
</asp:Panel>
当你点击buttonNext时,页面将回发并完成整个asp.net生命周期,但是控制更新面板的javascript只会应用对更新面板的contenttemplate所做的更改,这些更改面板已经向dom提出了请求出现在浏览器中。尝试重置click事件中buttonNext的文本,看看我想说的是什么。
我在更新面板和用户控件上找到了这篇文章http://msdn.microsoft.com/en-us/library/Bb398780(en-us,VS.90).aspx。
答案 1 :(得分:1)
您的按钮仍在更新面板内,并且使用3.5时,更新面板始终会将其中的事件视为触发器,除非您告诉它不要。这绝对是对3.0版本的改变,但自从3.5开始以来它没有改变,至少不是我所知道的。
因此,您的页面正在执行的操作是将按钮作为UpdatePanel的部分呈现的一部分来触发。由于它只是部分呈现,因此只更新了UpdatePanel内的内容,并且页面逻辑不在UpdatePanel内。
要解决此问题,您只需将此代码添加到UpdatePanel:
<Triggers>
<asp:PostBackTrigger ControlID="buttonNext" />
</Triggers>
这会强制它进行回复,并会显示第二个面板。