Hi all,
I created a page with an UpdatePanel inside a repeater, with a Timer to cause a postback.
My problem is that all the postbacks seem to happen simultaneously, and each postback seems to happen several times.
Instead, if I create a page with several UpdatePanel and Timer controls but no repeater, the postbacks are fired one after another, and only once, which is what I would like to have.
Here is a small example to reproduce this problem:
<asp:ScriptManager ID="ScriptManager1" runat="server" /><asp:Repeater ID="Repeater1" runat="server"><ItemTemplate><asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true"><ContentTemplate><asp:Timer ID="Timer1" runat="server" Enabled="true" OnTick="Timer1_Tick" Interval="500" /><asp:Label ID="Label1" runat="server" /></ContentTemplate></asp:UpdatePanel></ItemTemplate></asp:Repeater>
Codebehind:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Repeater1.DataSource = new int[5]; Repeater1.DataBind(); } } static int count = 0; protected void Timer1_Tick(object sender, EventArgs e) { Timer timer = (Timer)sender; timer.Enabled = false; // System.Threading.Thread.Sleep(2000); var l = (Label)timer.NamingContainer.FindControl("Label1"); l.Text = string.Format("[{0}] {1}", count, DateTime.Now.ToString("HH:mm:ss")); count++; }
Also, note that if I uncomment the "Thread.Sleep" line, it just keeps sending postabacks to the page (as the timer refresh interval is lower than the event handler execution time).
Another difference is that, if I register begin/end request handlers, they don't get called (while they get called in a page with multiple controls but not using a repeater):
<script type="text/javascript"> function BeginRequestHandler(sender, args) { alert('BeginRequestHandler'); } function EndRequestHandler(sender, args) { alert('EndRequestHandler'); } Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler); Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);</script>
Why is the behavior different?
What should I do to have the Timer inside the repeater behave like a "normal" timer on a page?
Thanks,
Paolo
NOTE: I tried the same code in an asp.net 3.5 and in an asp.net 4 application, and the behavior is different! The asp.net 3.5 application is behaving as I would expect, i.e. every postback is fired once. In the asp.net 4 application, instead, each postback can fire several times.