首页 文章

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

提问于
浏览
0

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

我们有一个ASPX页面,上面有2个asp:Panel控件(Panel1和Panel2) . 在每个面板中,都有一个WebUserControl(Panel1包含UserControl1,Panel2包含UserControl2) . 这个页面上有AJAX工具包Scriptmanager,就是这样 . 当用户首次访问页面时,会显示Panel1,并隐藏Panel2 .

在UserControl1中,有一个asp:Panel,一个包含asp:UpdatePanel的asp:Label,里面是一个asp:Button . 在后面的代码中,有一个委托和一个事件来引发它 - 当你点击按钮时会触发这个事件 . 在包含UserControl的ASPX页面中有一个此事件的处理程序 .

在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 回答

  • 2

    您的按钮仍在更新面板内,并且使用3.5时,更新面板始终将其中的事件视为触发器,除非您告诉它不要 . 这绝对是3.0版本中的变化,但自从3.5开始以来它没有改变,至少不是我所知道的 .

    因此,您的页面正在执行的操作是将按钮作为UpdatePanel的部分呈现的一部分来触发 . 由于它只是部分呈现,因此只更新了UpdatePanel内的内容,并且页面逻辑不在UpdatePanel中 .

    要解决此问题,您只需将此代码添加到UpdatePanel:

    <Triggers>
        <asp:PostBackTrigger ControlID="buttonNext" />
    </Triggers>
    

    这将迫使它回复邮件,并让你的第二个面板显示出来 .

  • 1

    仅更新更新面板的内容 . 因此,您需要从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中的dom浏览器 . 尝试重置click事件中buttonNext的文本,看看我想说的是什么 .

    我在更新面板和用户控件上发现了这篇文章http://msdn.microsoft.com/en-us/library/Bb398780(en-us,VS.90).aspx .

相关问题