ASP的奇怪的新错误:Panel / UserControl / UpdatePanel组合

时间:2010-03-10 16:41:23

标签: asp.net updatepanel user-controls panel

我会尽量在这里描述一下。我们有一些工作的代码,现在,没有被改变,不是。我已经解决了这个问题,所以情况如下:

我们有一个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

2 个答案:

答案 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>

这会强制它进行回复,并会显示第二个面板。