【问题标题】:Strange new error with ASP:Panel / UserControl / UpdatePanel combinationASP:Panel / UserControl / UpdatePanel 组合出现奇怪的新错误
【发布时间】:2011-01-25 23:55:42
【问题描述】:

我会尽量在这里描述。我们有一些正在运行的代码,而现在,没有被更改,却没有。我已经隔离了这个问题,所以情况如下:

我们有一个 ASPX 页面,上面有 2 个 asp:Panel 控件(Panel1 和 Panel2)。在每个面板中,都有一个 WebUserControl(Panel1 包含 UserControl1,Panel2 包含 UserControl2)。此页面上有 AJAX 工具包 Scriptmanager,仅此而已。当用户第一次访问页面时,Panel1 被显示,而 Panel2 被隐藏。

在 UserControl1 中,有一个 asp:Panel,一个 asp:Label 包含一个 asp:UpdatePanel 和一个 asp:Button。在后面的代码中,有一个委托和一个引发它的事件 - 当您单击按钮时,会触发此事件。在包含 UserControl 的 ASPX 页面中有一个针对此事件的处理程序。

在 Panel2 中有一个 asp:UpdatePanel、asp:Panel 和 asp:Label

所以在 ASPX 页面中,当您单击 UserControl1 中的按钮时,会处理该事件。此事件处理程序然后隐藏 Panel1 并显示 Panel2。至少那是过去发生的事情,但现在不会发生。

总结一下 - 第一次访问的 ASPX 页面显示 Panel1 和 UserControl1。在 UserControl1 中有一个按钮,用户单击它会在 ASPX 页面中引发事件,这应该隐藏 Panel1 并显示 Panel2。

如果您从 UserControl1 和 UserControl2 中删除 UpdatePanel,则代码可以正常工作。

显然,我们的“现实生活”代码更复杂 - 但这个小示例显示了问题所在。

这是一个包含问题的 zip:http://test.wikisaber.es/testajax.zip

【问题讨论】:

    标签: asp.net updatepanel user-controls panel


    【解决方案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>
    

    当您单击按钮下一步时,页面将回发并经历完整的 asp.net 生命周期,但是控制更新面板的 javascript 只会应用对已向 dom 发出请求的更新面板的 contenttemplate 所做的更改存在于浏览器中。尝试在单击事件中重置 buttonNext 的文本,看看我想说什么。

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

    【讨论】:

    • 感谢 Dug,但 ASPX 页面中没有 UpdatePanel,只有在 UserControls 中 - 请查看代码示例。
    • 更新面板允许您进行部分页面渲染,并且只会显示提交更新面板内容的更改。因此,当我从代码示例中的用户控件中删除更新面板并在 default.aspx 页面中添加一个围绕但用户控件的更新面板时,它会按预期显示第二个用户控件中的标签文本。
    • 正如我在原帖 Dug 中所说:“如果您从 UserControl1 和 UserControl2 中删除 UpdatePanels,则代码有效。”我知道的就这么多。该代码曾经工作。我正在寻找为什么它现在没有,因为据我所知,代码没有任何问题,应该可以正常工作。
    • 代码正在正常工作,并且正在呈现对第一个用户控件中更新面板的内容所做的所有更改。如果您希望显示第二个用户控件的内容,则它需要与要呈现的第一个用户控件位于同一更新面板中。
    • 很抱歉,Dug,但代码无法正常工作。当引发按钮单击事件时,第一个 asp:Panel 应该隐藏,第二个变为可见。这是用于处理代码的方式,与 UserControls 中包含的更新面板无关。代码没有任何变化,但它不再像这样工作了。
    【解决方案2】:

    您的按钮仍在更新面板中,在 3.5 中,更新面板始终将其中的事件视为触发器,除非您告诉它不要这样做。这绝对是与 3.0 中可用的内容相比的变化,但自 3.5 可用以来它没有改变,至少我不知道。

    因此,您的页面所做的是触发按钮作为 UpdatePanel 部分呈现的一部分。由于只是部分渲染,只有UpdatePanel里面的内容被更新了,页面逻辑不在UpdatePanel里面。

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

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

    这将强制它进行回发,并显示您的第二个面板。

    【讨论】:

    • 谢谢查尔斯——不过我有一个问题。如果 UpdatePanel 不将事件视为触发器,那么为什么在我的代码示例中当我在调试中单步执行它时 - 引发 DetailsChanged 事件并且在 Default.aspx.cs 中代码通过 testUserControl1_DetailsChanged 事件处理程序方法运行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2011-01-08
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    相关资源
    最近更新 更多