【问题标题】:Conditionally trigger a full page postback from a link button inside an update panel有条件地从更新面板内的链接按钮触发整页回发
【发布时间】:2010-11-29 23:10:33
【问题描述】:

如何从更新面板内的链接按钮有条件地触发整页回发?

我有一个自定义控件,它包含自己的更新面板,其中嵌套了一个链接按钮。当按下链接按钮时,我希望其事件处理程序可以选择让控件正常更新或在页面上进行完整回发。

这是控制层次结构:

Page
  Custom Control
    UpdatePanel
      LinkButton

事件处理程序伪代码:

LinkButton Click Handler Begin
    If is a partial post back AND a full postback is needed
        Page.DoFullPostback 
    End If
End Handler

注意:我需要进行部分回发。我正在考虑在控件标记中注入__DoPostback,但这对我来说似乎很老套。

感谢您的帮助!

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    对不起,我对VB不熟悉,所以我的示例源代码将用C#编写:

    protected void btnLink_Click(object sender, EventArgs e)
    {
        bool isAsync = ScriptManager.GetCurrent(Page).IsInAsyncPostBack;
        bool postBackIsNeeded = true;
    
        if (isAsync && postBackIsNeeded)
        {
            ScriptManager.GetCurrent(Page).RegisterPostBackControl(btnClick);
            string postback = Page.ClientScript.GetPostBackEventReference(
                btnClick, 
                string.Empty
            );
            ScriptManager.RegisterStartupScript(
                btnClick, 
                btnClick.GetType(), 
                "postback", 
                postback, 
                true
           );
    }
    

    }

    主要思想是更改LinkButton 控件的回发类型。如果有必要,它应该在异步回发事件期间更改为完整回发而不是部分回发。在此之后,应该生成另一个回发脚本,并且应该在页面返回给客户端后立即执行。

    最后一件事 - 使用循环检测条件(在我的情况下为if (isAsync && postBackIsNeeded))否则回发将是无限的。

    【讨论】:

    • 我需要这个来解决我遇到的问题。我基于 ViewState 对象在 Page_Load 中动态生成控件。但是,视图状态对象在按钮单击事件处理程序中更新/修改。根据页面生命周期,button_click 事件处理程序在 button_click 回发之后执行,所以我的视图状态本质上是在使用它的 page_load 之后更新的。我在 button_click 中使用了这段代码来导致另一个回发,从而导致 page_load 再次执行。我还将我的视图状态修改代码放在 if 语句中。感谢分享!
    • 有没有办法从异步回发中渲染整个页面而无需再次回发?这似乎发生在很多人身上,所以我希望也有一种方法可以动态触发这种行为。
    【解决方案2】:

    最简单的方法是在页面的某个位置(在任何 UpdatePanel 之外)创建一个隐藏按钮。当您需要进行完整回发时,请使用 JavaScript 单击按钮或向其发出 __doPostback()。您可以在 JavaScript 中通过在 UpdatePanel 本身上调用 __doPostback() 或调用其中的按钮以编程方式实现部分 postpack。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      相关资源
      最近更新 更多