IPostBackEventHandler不会在异步回发时触发RaisePostBackEvent

时间:2009-05-08 15:03:17

标签: asp.net asynchronous postback

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

默认情况下,单击时,我的控件将执行__doPostBack其客户端ID以进行整页刷新,当然还会触发RaisePostBackEvent。

但是,我希望能够使用控件刷新更新面板,因此从客户端我使用__doPostBack方法和更新面板的ID以及其他参数。

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

长话短说,如果我有异步回发,如何触发RaisePostBackEvent?或者是否有另一个具有类似功能的界面?

3 个答案:

答案 0 :(得分:6)

事情是(如果我理解你的问题),调用__doPostBack的控件必须实现IPostBackEventHandler接口。所以,例如,如果我在usercontrol(实现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,但是用户控件没有。

答案 1 :(得分: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。

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

答案 2 :(得分:0)

this line is the key or the custom click event ignores updatepanel 
// ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(this);

and note the IPostBackEventHandler part in page definition

in this example ordinary button and a custom click event div work together inside an update panel

public partial class 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(); } } }

}