我设计了一个自定义用户控件,基本上是一个实现IPostBackEventHandler
接口的按钮,显然定义了RaisePostBackEvent(string eventArgument)
方法,在那里我做了一些处理,基本上我触发了其他事件。
默认情况下,单击时,我的控件将执行__doPostBack
其客户端ID以进行整页刷新,当然还会触发RaisePostBackEvent。
但是,我希望能够使用控件刷新更新面板,因此从客户端我使用__doPostBack
方法和更新面板的ID以及其他参数。
问题是RaisePostBackEvent
未被触发。我知道我可以查看Page.Request.Params["__EVENTARGUMENT"]
并做任何我需要的事情,但我真的想要像IPostBackEventHandler
一样简单而优雅的东西,以便拥有我控制下的所有逻辑。
长话短说,如果我有异步回发,如何触发RaisePostBackEvent
?或者是否有另一个具有类似功能的界面?
答案 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 panelpublic 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(); } } }
}