【问题标题】:Why does a button control need to be clicked twice?为什么一个按钮控件需要点击两次?
【发布时间】:2010-09-07 20:25:18
【问题描述】:

我有一个使用 VB 和 Ajax 工作的 Web 应用程序。我正在使用更新面板来避免回发到服务器时令人讨厌的“闪烁”。

我想在更新面板本身内定义一个按钮控件(尝试将其移到外面并得到一些灾难性错误,所以将其留在那里),这使得当前面板不可见而同级面板可见。这适用于必须单击两次按钮的例外情况。不是双击,而是单击一次而不是再次单击。

在设置断点时,我发现附加到按钮的代码实际上是在第一次单击时执行的,但面板没有按预期切换。如果我单击相同的按钮或更糟糕的是,单击不同的按钮,则会出现第二个面板的预期行为。然而,随着第二个按钮被点击,第三个面板被显示出来,第三个面板由于第二个按钮被点击而变得可见。

我假设这种行为是由于更新面板及其 Ajax 特性造成的。有没有办法避免第二次点击?我在滥用更新面板吗?我真的很想使用模态弹出窗口(就在 AjaxToolKit 之外),但是在回发数据时遇到了问题,所以我选择了这种方法。任何见解、帮助甚至批评都将受到欢迎,因为这已经困扰了我足够长的时间。谢谢

【问题讨论】:

    标签: asp.net vb.net asp.net-ajax updatepanel


    【解决方案1】:

    我发现这发生在 2 个不同的场景下:

    1. 没有在控件上设置 ID。 ID 不在标记中,或者在创建动态控件时未设置 ID。 ASP.Net 使用 ID 来跟踪操作。

    2. 嵌套更新面板。场景:使用 Masterpage 时,您可能有一个包含在 UpdatePanel 中的内容占位符,这样页面上的内容就不需要 UpdatePanel。然后,在开发页面时,您可能会习惯性地添加一个 UpdatePanel。

    【讨论】:

      【解决方案2】:

      尝试在创建动态控件时为其提供 ID。
      出于某种原因,.net 要求动态控件在此上下文中工作。

      myControl.id="newID"
      

      【讨论】:

        【解决方案3】:

        就像其他人所说的更新面板只更新其内容,这是使用它的主要好处之一。

        Panel2 和 pnlPrvCmt 需要在您的更新面板中,您的按钮单击方法才能工作。另一种选择是将 Panel2 放在一个更新面板中,将 pnlPrvCmt 放在第二个更新面板中。然后,只要 UpdateMode=Always(默认情况下),任一更新面板中的任何控件都会导致两者都刷新。

        【讨论】:

          【解决方案4】:

          这是一个相当简单的解决方案。 (今天早上我遇到了同样的问题。)

          UpdatePanel 无法在其外部呈现内容。因此,正如您所注意到的,更新正在发生,但您看不到结果。

          最简单的解决方案是强制进行完整回发。你可以这样做:

          protected override void OnInit(EventArgs e)
          {
              var scriptManager = ScriptManager.GetCurrent(this);
              // or this.Page in a UserControl, etc.
          
              scriptManager.RegisterPostBackControl(someButton);
              scriptManager.RegisterPostBackControl(someOtherButton);
              // etc. for each control that needs to update something outside the UpdatePanel
          }
          

          这仍然允许 Ajax 在 UpdatePanel 中更新按钮本身(例如,将其状态更改为禁用或启用)。仅当单击按钮时才会发生完整的回发。

          【讨论】:

            【解决方案5】:

            我认为您的问题是方法执行后只有更新面板从服务器接收数据。您尝试更改的面板位于更新面板之外,因此它不知道其属性已更改。

            您要么需要进行整页回发,要么将要修改的面板放在更新面板中。

            【讨论】:

              【解决方案6】:

              您的更新面板位于其他面板中。

              应该反过来吗?更新面板中的仅 AFAIK 控件将通过 AJAX 调用进行更新。

              【讨论】:

                【解决方案7】:

                我以前遇到过这个问题并解决了,我只是不记得是怎么解决的。我将尝试找到我的旧代码并回复您。想一想,您是否在脚本管理器中启用了 EnablePartialRendering?也许尝试将两个容器包装在第三个面板中。

                【讨论】:

                  【解决方案8】:

                  如果您摆脱 UpdatePanels,PostBacks 是否可以按预期工作?很有可能您的 Page_Load 或其他更高级别的事件在到达您的点击事件之前以某种方式“重置”了一些东西。会这样吗?

                  【讨论】:

                    猜你喜欢
                    • 2022-01-21
                    • 1970-01-01
                    • 2019-05-30
                    • 2012-02-08
                    • 2020-02-05
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多