如何使UpdatePanel中的按钮强制进行完整的页面回发(Full post-back)?

74

如何从 UpdatePanel 中的按钮强制进行完整的页面回传?

5个回答

89
你可以使用UpdatePanel的Triggers属性来注册触发完整回发的操作。
在该属性中添加一个PostBackTrigger对象,其中包含需要触发完整回发的控件的ControlID。
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
        ...
    </ContentTemplate>
    <Triggers>
        <asp:PostBackTrigger ControlID="myFullPostBackControlID" />
    </Triggers>
</asp:UpdatePanel>

我有一个包含按钮的Infragistics UltraWebGrid列。我遇到了一个问题,即单击按钮会触发它们的事件处理程序,然后刷新网格,但网格直到第二次单击才会实际刷新。将按钮放入UpdatePanel并添加这些触发器解决了问题。 - tsilb

51

因为没有其他人提到,所以我在这里加上。可以用一行代码在code-behind中完成此操作,而不需要使用上述任何方法。只需将以下内容放入page_load中:

Visual Basic

ScriptManager.GetCurrent(Me).RegisterPostBackControl(myButtonID)

C#

ScriptManager.GetCurrent(this).RegisterPostBackControl(myButtonID);

3
非常好,经过数小时的搜索,终于找到了一个可行的解决方案。问题在于我的所有控件(更新面板和按钮)都是在代码后端创建的,所以无法设置 postbacktrigger。谢谢! - OverMars
2
你应该能够做到。当控件被创建时,您可以使用AddHandler来创建触发器以调用响应的子程序。 - EvilDr
非常正确,它非常简单,就在那里,我几乎感到尴尬,从来没有想到过。不过非常好。 - OverMars
什么是'Me'?当前上下文中不存在的错误。 - Fandango68
2
我是用于页面的Visual Basic。我认为在C#中,你可以使用thispage - EvilDr
显示剩余3条评论

13

来自这里

使用PostBackTrigger控件可以使UpdatePanel内的控件引发一次完全的回发,而不是执行异步回发。

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

嗯,但如果在UpdatePanel中有一个带有页面编号的GridView,例如更改到新页面,则触发器将不起作用。 - Fandango68

0

这是一个老问题,也有一些棘手的方法,当所有东西都在更新面板中,并且您想要进行完整的后台提交以使您的Document.Ready代码能够在单击时工作。

1. 在更新面板之外创建一个虚拟按钮,并像这样从后端代码中单击它

ScriptManager.RegisterStartupScript(Page, this.GetType(), "ResetDoc", "ResetDocumentReady();", true);

2. 在前端定义函数如下:

function ResetDocumentReady() {
        $("[id$=DummyButton]").click();
    }

注意:但最好的方法是使用触发器,@Thibault Falise发布的答案:)


0

我在使用WebDataGrid中的ImageButton时遇到了同样的问题。

我将EvilDr的代码放在了WebDataGrid的preRender事件中,效果非常好!

for (int i = 0; i < wdgMyData.Rows.Count; i++)
{
   ScriptManager.GetCurrent(this).RegisterPostBackControl((ImageButton)wdgMyData.Rows[i].Items[3].FindControl("btnDownloadExcel"));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接