【问题标题】:IPostBackEventHandler RaisePostBackEvent not triggered on asynchronous postbackIPostBackEventHandler RaisePostBackEvent 未在异步回发时触发
【发布时间】:2009-05-08 15:03:17
【问题描述】:

我设计了一个自定义的用户控件,基本上是一个按钮,实现了IPostBackEventHandler接口,并且明显定义了RaisePostBackEvent(string eventArgument)方法,在这里我做一些处理,基本上我触发其他事件。

默认情况下,当点击我的控件时,我的控件会执行__doPostBack它的客户端ID来刷新整个页面,当然会触发RaisePostBackEvent。

但是,我希望能够使用控件来刷新更新面板,因此从客户端我使用带有更新面板 ID 和附加参数的 __doPostBack 方法。

问题是RaisePostBackEvent没有被触发。我知道我可以查看Page.Request.Params["__EVENTARGUMENT"] 并做任何我需要的事情,但我真的想要像IPostBackEventHandler 这样简单而优雅的东西,以便让所有逻辑都在我的控制之中。

长话短说,如果我有异步回发,如何触发RaisePostBackEvent?或者有没有其他类似功能的界面?

【问题讨论】:

    标签: asp.net asynchronous postback


    【解决方案1】:

    问题是(如果我正确理解您的问题)调用 __doPostBack 的控件必须实现 IPostBackEventHandler 接口。因此,例如,如果我在用户控件(实现 IPostBackEventHander)中有此标记:

    <asp:Button runat="server"
         UseSubmitBehavior="false" ID="Button"
         Text="Update"
         OnClientClick="myfunction();"/>
    

    myfunction javascript 必须如下所示:

    <script type="text/javascript">
        function myfunction(param)   
        {
            __doPostBack("<%= this.UniqueID %>", "myargs");    
        }
    </script>
    

    请注意,我发送的是 this.UniqueID 而不是 Button.UniqueID,因为按钮没有实现 IPostBackEventHander 但用户控件实现了。

    【讨论】:

    • 问题是在控件中我有一个更新面板并且通过异步回发我必须只更新更新面板的内容所以在我的javascript函数中我说__doPostBack("updatePanelID", "myargs");和方法@ 987654324@ 永远不会被调用,即使我的控件实现了IPostBackEventHandler 接口。
    • 但是 UpdatePanel 没有实现 IPostBackEventHandler,还是我遗漏了什么?因此,您不能将 UpdatePanel 的 Id 作为第一个参数发送给 __DoPostBack(...),您必须发送控件的 Id 以及该控件的唯一(命名容器 id)。
    • 加 1 用于使用 UniqueID。我使用的 ClientID 导致 RaisePostBackEvent 没有触发。
    【解决方案2】:

    我在寻找解决方案时遇到了同样的问题并发现了这个主题。我找到了它,所以我会发布它以帮助可能遇到相同问题的开发人员。

    在你的 UserControl 中实现 IPostBackEventHandler 接口:

    Public Class UserControl_Rattachement
    Inherits System.Web.UI.UserControl
    Implements ICallbackEventHandler, IPostBackEventHandler
    

    在 RaisePostBackEvent 函数中,调用 UpdatePanel 的 Update() 方法:

    Public Sub RaisePostBackEvent(eventArgument As String) Implements System.Web.UI.IPostBackEventHandler.RaisePostBackEvent
        // Code executed during the PostBack
        UpdatePanel1.Update()
    End Sub
    

    在 UserControl 的 Page_Load 方法中,将 PostBack 定义为异步:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(Me)
    End Sub
    

    现在在 Render 方法中添加客户端脚本:

    Protected Overrides Sub Render(writer As System.Web.UI.HtmlTextWriter)
        MyBase.Render(writer)
    
        Dim postbackReference As String = Page.ClientScript.GetPostBackEventReference(Me, Nothing, True)
        Dim postbackScript As String = String.Format("function updateRattachement() {{ {0}; }}", postbackReference)
    
        writer.WriteLine("<script type=""text/javascript"">")
        writer.WriteLine(postbackScript)
        writer.WriteLine("</script>")
    End Sub
    

    然后,在需要时调用您的客户端函数:

    updateRattachement();
    

    PostBack 将是异步的,这将刷新您指定的 UpdatePanel。

    我希望这会有所帮助,对不起我的英语。

    【讨论】:

      【解决方案3】:

      此行是关键或自定义点击事件忽略更新面板 // ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(this);

      并注意页面定义中的 IPostBackEventHandler 部分

      在此示例中,普通按钮和自定义单击事件 div 在更新面板中一起工作

      公共部分类 tmp2 : System.Web.UI.Page, IPostBackEventHandler {

      protected void Page_Load(object sender, EventArgs e) { ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(this); if (!Page.IsPostBack) { div1.Attributes["onclick"] = ClientScript.GetPostBackEventReference(this, "ClickDiv"); } } protected void Button1_Click(object sender, EventArgs e) { Label1.Text += "1"; UpdatePanel1.Update(); } protected void Div1_Click() { div1.InnerHtml += "b"; UpdatePanel1.Update(); } public void RaisePostBackEvent(string eventArgument) { if (!string.IsNullOrEmpty(eventArgument)) { if (eventArgument == "ClickDiv") { Div1_Click(); } } }

      }

      【讨论】:

        猜你喜欢
        • 2010-09-05
        • 1970-01-01
        • 2016-08-03
        • 2012-04-12
        • 2015-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-16
        相关资源
        最近更新 更多