【问题标题】:How do I get a button that is inside an asp:UpdatePanel to update the whole page?如何获得一个位于 asp:UpdatePanel 内的按钮来更新整个页面?
【发布时间】:2008-10-21 12:02:04
【问题描述】:

我在更新面板中有一个按钮,我想更新整个页面。我设置了ChildrenAsTriggers="false"UpdateMode="Conditional"

我这里有一些示例代码来演示我的问题。

<asp:UpdatePanel ID="myFirstPanel" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional">
   <ContentTemplate>
      <asp:Button runat="server" ID="myFirstButton" Text="My First Button" onclick="myFirstButton_Click" />
      <asp:Button runat="server" ID="mySecondButton" Text="My Second Button" onclick="mySecondButton_Click" />
   </ContentTemplate>
</asp:UpdatePanel>

<asp:UpdatePanel ID="mySecondPanel" runat="server">
   <ContentTemplate>
       <asp:Label runat="server" ID="myFirstLabel" Text="My First Label"></asp:Label>
    </ContentTemplate>
    <Triggers>
       <asp:AsyncPostBackTrigger ControlID="myFirstButton" EventName="Click" />
    </Triggers>
</asp:UpdatePanel>
<asp:Label runat="server" ID="mySecondLabel" Text="My Second Label"></asp:Label>

以及背后的代码:

protected void myFirstButton_Click(object sender, EventArgs e)
{
  myFirstLabel.Text = "Inside Panel " + DateTime.Now.ToString("mm:ss");
}
protected void mySecondButton_Click(object sender, EventArgs e)
{
  mySecondLabel.Text = "Outside Panel " + DateTime.Now.ToString("mm:ss");
}

我想在单击第二个按钮时更新不在更新面板内的标签。 第二个按钮需要在更新面板中。我不想将标签放入更新面板。

【问题讨论】:

    标签: asp.net-ajax triggers updatepanel


    【解决方案1】:

    尝试将 PostBackTrigger 添加到第一个 UpdatePanel,用于第二个按钮。这将告诉更新面板,该按钮应该进行完整的回发。

    【讨论】:

    • 谢谢杰斯珀!在过去的半个小时里,我一直在试图弄清楚如何做到这一点。
    【解决方案2】:

    ScriptManager.GetCurrent(Page).RegisterPostBackControl(button);会解决你的问题

    【讨论】:

      【解决方案3】:

      如果您像这样将 PostBackTrigger 添加到第一个更新面板

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

      这将导致在单击第二个按钮时发生完整的回帖。这正是我正在寻找的行为。

      【讨论】:

        【解决方案4】:

        我有一个类似但稍微复杂一点的案例,我花了一天多的时间才弄清楚这个答案。 (答案与@serkan 给出的答案基本相同。我只是在扩展它。)我们有一个 ASP.NET 用户控件,该控件有一个按钮,单击该按钮会生成图像并触发图像的下载.这在普通页面上工作得很好,但当用户控件嵌入到更新面板中时就不行了。我不知道如何告诉更新面板只为这个按钮进行定期回发,特别是因为该按钮位于用户控件内,而使用它的页面没有明显的访问权限。

        最终奏效的方法非常简单。无需尝试为面板指定回发触发器。相反,在 用户控件的 Page_Load 中, 我添加了以下内容:

            protected void Page_Load(object sender, EventArgs e)
            {
                // If the chart is within an update panel then we need to tell the script manager
                // to not do an asynch postback on chartdownload.  If we don't, the download
                // doesn't work.
                var scriptManager = ScriptManager.GetCurrent(Page);
                if (scriptManager != null)
                {
                    scriptManager.RegisterPostBackControl(ChartSaveButton);
                }
                // Rest of Page_Load followed here...
        

        此外,我创建了ChartSaveButton 属性来轻松访问按钮的控件:

            private Control ChartSaveButton
            {
                get { return FindControl("btnDownloadChart"); }
            }
        

        (“btnDownloadChart”是按钮的ID。)

        到达这里是一条痛苦的道路,但我很高兴解决方案如此优雅。我希望这会对你有所帮助。

        【讨论】:

          【解决方案5】:

          对我来说,这种设置没有意义。请记住,虽然更新面板可能是一种非常容易实现类似 ajax 效果的好方法,但它们并不是在所有情况下都理想。

          如果您的页面架构需要像您在示例中那样排列元素,您最好考虑使用带有 javascript 的页面或服务方法来更新标签。

          【讨论】:

            【解决方案6】:

            如果标签不在更新面板中,刷新值的唯一方法是像在正常回发中一样刷新整个页面。您必须重定向到同一页面才能刷新它。即使请求来自更新面板,ajax 框架也知道要处理重定向,因此只需在按钮单击时执行 Response.Redirect(...)。

            【讨论】:

            • 抱歉,这是完全错误的。 @serkan 和我都提供了答案,展示了如何在没有明确重定向的情况下完成。
            猜你喜欢
            • 1970-01-01
            • 2021-10-26
            • 1970-01-01
            • 2015-11-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多