如何阻止 UpdatePanel 导致整个页面回发?

Posted

技术标签:

【中文标题】如何阻止 UpdatePanel 导致整个页面回发?【英文标题】:How to stop UpdatePanel from causing whole page postback? 【发布时间】:2010-10-18 04:50:27 【问题描述】:

我正在使用 .NET 3.5 并在 Community Server 2008 框架内构建页面。

在其中一个页面上,我正在尝试让 UpdatePanel 正常工作。

我直接从 ASP.NET 网站获取了一个示例,通过单击按钮将 UpdatePanel 中的时间更新为当前时间, 但由于某种原因,当我尝试执行该功能时,整个页面都会刷新.

这是我所拥有的:

protected void Button1_Click(object sender, EventArgs e)

    Label1.Text = "Panel refreshed at " + DateTime.Now.ToString();
    Label2.Text = "Panel refreshed at " + DateTime.Now.ToString();

<asp:ScriptManager ID="ScriptManager1" runat="server"/>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <fieldset>
            <legend>UpdatePanel</legend>
            <asp:Label ID="Label1" runat="server" Text="Panel created."></asp:Label><br />
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        </fieldset>
    </ContentTemplate>
</asp:UpdatePanel>

每当我单击按钮时,确保面板会更新 - 但整个页面都会发回!我可以看到整个页面在闪烁。我到底做错了什么?

我在一个嵌套的母版页中,但我不确定这是否是一个问题。我正在使用的社区服务器框架中是否有某些东西会导致所有事件回发?

【问题讨论】:

【参考方案1】:

您是否尝试在“触发器”部分将Button1 设置为AsyncPostBackTrigger?将ChildrenAsTriggers 属性设置为true,将UpdateMode 属性设置为Conditional

protected void Button1_Click(object sender, EventArgs e)
    
    Label1.Text = "Panel refreshed at " + DateTime.Now.ToString();    
    UpdatePanel1.Update();
    
<asp:ScriptManager ID="ScriptManager1" runat="server"/>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional">
    <Triggers>        
        <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />    
    </Triggers>    
    <ContentTemplate>        
        <fieldset>            
            <legend>UpdatePanel</legend>            
            <asp:Label ID="Label1" runat="server" Text="Panel created."></asp:Label><br />            
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />        
        </fieldset>    
    </ContentTemplate>
</asp:UpdatePanel>

【讨论】:

带有 asyncpostbacktrigger 的触发器部分让我很开心,非常感谢!! 有人可以解释为什么需要这个显式异步触发器吗?默认情况下,UpdatePanel 中的控件不应该导致部分页面更新吗? 我已设置好所有内容,但我的页面仍在刷新整个页面:/【参考方案2】:

我在上面的代码示例中没有看到 Label2。如果 Label2 位于 UpdatePanel 之外,则会发生整个页面刷新,因为这是页面正确更新 Label2 所必需的。

默认情况下,UpdatePanel 只会在被其中的控件触发时动态刷新其中的内容。如果您需要进行一些更高级的更新,例如面板外部的按钮导致刷新或不同面板中的标签被更新,那么您需要在 UpdatePanel(s) 上设置 Conditional 属性并进行一些手动更新调用在你的代码中。

【讨论】:

【参考方案3】:

另一个可能的原因是,如果页面有ClientIDMode="static",那么您希望仅刷新 UpdatePanel 的控件将刷新整个页面。

要解决此问题,您只需在控件上设置ClientIDMode="AutoID" 即可触发 UpdatePanel 回发。

【讨论】:

我遇到了类似的问题。也许你可以帮助***.com/questions/55817520/…【参考方案4】:

如果您有一个从 .net framework v1.1 升级的旧项目,请从您的网络配置中删除此行以使其正常工作:

<xhtmlConformance mode="Legacy"/>

【讨论】:

这如何回答这个问题? 这是我的确切问题。晚了两年,但它回答了这个问题,因为从 web.config 中删除它确实阻止了整页回发。 这对我也很有帮助。谢谢! 我花了很长时间才找到这个答案。谢谢【参考方案5】:

在您的 UpdatePanel 控件上设置 ChildrenAsTriggers="true"

【讨论】:

【参考方案6】:

“默认情况下,UpdatePanels 只会在被其中的控件触发时动态刷新其中的内容。”

否则会刷新整个页面!这就是重点!

【讨论】:

以上是关于如何阻止 UpdatePanel 导致整个页面回发?的主要内容,如果未能解决你的问题,请参考以下文章

UpdatePanel 中的复选框列表在选中项目时触发完整的回发

从 JavaScript 添加 asp.net 下拉列表项会导致页面回发错误

UpdatePanel 异步回发后的 Javascript 事件订阅

转发器会导致整个页面的回发,即使它位于更新面板内

由 UpdatePanel 内 GridView 内的 LinkBut​​ton 触发的完整回发

使用 JavaScript 的 ASP.NET 回发