我想在updatepanel自身中定义一个按钮控件(尝试将其移到外部并出现一"/>

关于asp.net:为什么一个按钮控件需要被单击两次?

关于asp.net:为什么一个按钮控件需要被单击两次?

Why does a button control need to be clicked twice?

我有一个使用VB和Ajax的Web应用程序。我正在使用updatepanels来避免在回发到服务器时产生恼人的"闪烁"。

我想在updatepanel自身中定义一个按钮控件(尝试将其移到外部并出现一些灾难性错误,因此将其留在此处),使当前面板不可见,而同级面板可见。除必须单击两次按钮外,此方法有效。不是双击,而是单击一次而不是再次单击。

在设置断点时,我发现在按钮上附加的代码实际上是在第一次单击时执行的,但是面板没有按预期进行切换。如果单击相同的按钮或更糟糕的是单击其他按钮,则会出现第二个面板的预期行为。但是,在单击第二个按钮的情况下,显示了第三个面板,这是不必要的奖励,由于单击了第二个按钮,第三个面板变得可见。

我假设此行为是由于updatepanel及其Ajax性质引起的。有没有办法避免第二次点击?我在滥用更新面板吗?我真的很想使用模式弹出窗口(直接在AjaxToolKit中使用),但是在回发数据时遇到问题,因此我选择了这种方法。任何见识,帮助,甚至批评都将受到欢迎,因为这困扰了我足够长的时间。谢谢


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

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


如果您摆脱了UpdatePanels,使用BackBacks是否可以正常工作?可能是Page_Load或链中其他较高级别的事件在单击事件之前以某种方式"重置"了某些事件。可能是这种情况吗?


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

  • 未在控件上设置ID。创建动态控件时,要么将ID保留在标记之外,要么未设置ID。 ASP.Net使用该ID来跟踪操作。

  • 嵌套的UpdatePanels。 Scenerio:使用母版页时,可能会有一个内容占位符,该内容占位符包装在UpdatePanel中,因此页面上的内容中不需要UpdatePanel。然后,在开发页面时,您可能会习惯添加一个UpdatePanel。


  • 尝试在创建动态控件时为其指定ID。由于某种原因,.net要求动态控件才能在这种情况下工作。

    1
    myControl.id="newID"

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

    Panel2和pnlPrvCmt必须位于更新面板中,才能使按钮单击方法起作用。另一种选择是将Panel2放在一个更新面板中,将pnlPrvCmt放在另一个更新面板中。然后,只要UpdateMode = Always(默认为默认值),则任何一个更新面板中的任何控件都将导致两者刷新。


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

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

    最简单的解决方案是强制执行完整的回发。您可以这样操作:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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中进行更新(例如,将其状态更改为"禁用"或"启用")。只有单击按钮,才会发生完整的回发。


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

    那是另一回事吗?仅AFAIK更新面板中的控件将通过AJAX调用进行更新。


    我之前遇到过这个问题并已解决,但我不记得如何。我将尝试找到我的旧代码并与您联系。一个想法,您在脚本管理器中启用了EnablePartialRendering吗?也许尝试将两个容器都包装在第三个面板中。


    推荐阅读