views:

9166

answers:

9

I'm sure this is easy but I can't figure it out:

I have an ASP.NET page with some UpdatePanels on it. I want the page to completely load with some 'Please wait' text in the UpdatePanels. Then once the page is completely loaded I want to call a code-behind function to update the UpdatePanel.

Any ideas as to what combination of Javascript and code-behind I need to implement this idea?

SAL

PS: I've tried putting my function call in the Page_Load but then code is run before the page is delivered and, as the function I want to run takes some time, the page simply takes too long to load up.

+2  A: 

Have a look at ScriptManager.RegisterStartupScript

The idea is that you register a script to run on start up (I believe once the page has loaded). Your script should call a function that causes a post back through your UpdatePanel

Tom Carter
This is a better correct answer. Thanks Tom, for pointing me in the right direction. Extended answer here: http://stackoverflow.com/questions/3877951/how-can-i-defer-loading-updatepanel-content-until-after-the-page-renders
Bryan
A: 

The ScriptManager.RegisterStartupScript allows a script to run on startup inside of an update panel. if you use the old ClientScript.RegisterStartupScript then the script you render will be outside the bounds of the udpate panel, and thus won't be executed during async page loads.

Ben Scheirman
A: 

Using Tom's approach with the startup script, you can then call:

__doPostBack('UpdatePanelName', '');

Daniel Pollard
A: 

OK....

Next newbie question. How do I call a code behind function from Javascript?

SAL
+1  A: 

Use a timer control that will be fired after a certain number of milliseconds (for page to load). In the timer tick event refresh the update panel.

moza
+2  A: 

I fiddled around with the ScriptManager suggestions - which I reckon I would have eventually got working but it seems to me that the Timer idea is easier to implement and not really(!) that much of a hack?!

Here's how I got my panel updated after the initial page render was complete...

default.aspx (BTW markdown replaces the underscore character with _)

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AJAXPostLoadCall._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <h2>And now for a magic trick...</h2>
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="True">
        </asp:ScriptManager>
        <div>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <ContentTemplate>
                    <asp:Timer ID="Timer1" runat="server" Interval="2000" ontick="Timer1_Tick" />
                    <asp:Label ID="Label1" runat="server">Something magic is about to happen...</asp:Label>
                </ContentTemplate>
            </asp:UpdatePanel>

        </div>
    </form>
</body>
</html>

and the code behind default.aspx.cs reads (again note the underscore _ is replaced with &#95; in markdown for some reason (how do I turn that off??))

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace AJAXPostLoadCall
{
    public partial class _Default : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
        }

        public void DoMagic()
        {
            Label1.Text = "Abracadabra";
        }

        protected void Timer1_Tick(object sender, EventArgs e)
        {
            // Do the magic, then disable the timer
            DoMagic();
            Timer1.Enabled = false;
        }

    }
}

So, the page loads up and the Timer (contained within the UpdatePanel) fires 2 secs after the page has loaded up (I think - I'm not sure when the Timer actually starts?). The label text is rewritten and then the Timer is disabled to stop any more updates.

Simple enough - but can you purists out there tell me if this is a Horrible Hack?

SAL
A: 

A thumbs-up and thanks to SAL and the rest of you guys. This solved a big issue I had, my procedure was taking up to a minute for the page to finally render and display.

Thanks!

A: 

Doing things like this with UpdatePanels rather than something easily understandable WILL bite you, it's just a matter of when.

erikkallen
I think UpdatePanels are easily understandable! Are you taking issue with the timer idea or with the whole notion of ASP UpdatePanels?What biting do I need to be aware of?Thanks....
SAL
@Sal: Do you know what's happening behind the scenes? Including the page lifecycle? How is the viewstate propagated to the page viewstate? Why does this fail with nested UpdatePanels unless Framework 3.5 SP1 is installed on the web server?
erikkallen
A: 

From the very first question on this post, I think what the user is looking for is a message to be displayed to the user while the update panel loads. Just put an UpdateProgress control like the one below on your page just above your UpdatePanel control, and feel free to trigger an event in your UpdatePanel, put your backend code as usual, and whatever is contained inside the UpdateProgress control will load up while your UpdatePanel content is being processed in the backend.

<asp:UpdateProgress AssociatedUpdatePanelID="UpdatePanel1" ID="UpdateProgress1" runat="server">
  <ProgressTemplate>
    <div class="mystyleclass">
      Please Wait...
    </div>
  </ProgressTemplate>
</asp:UpdateProgress>

There is no need for any messy manual javascript stuff.