views:

1918

answers:

2

I know I can hook into the client side events to run JavaScript after every partial postback; however, I want to do something like this:

protected void FooClicked(object sender, EventArgs e) {
        ClientScript.RegisterStartupScript(GetType(), "msg", "showMsg('Foo clicked');",true);        
}

I know I could totally hack it with hidden fields and run something after every postback, but there should be a pretty straightfoward way to in a similar fashion to this.

+5  A: 

The specific code sample you are describing does not work with partial post-backs, since ClientScript.RegisterStartupScript() writes JS to the page during the output construction phase of the request lifecycle; whereas a partial postback only updates a selected portion of the page via JavaScript (even though the markup for the entire page, including your startup script, is generated on the server).

To closely mimic what you are describing, you ought to include a Literal control inside your UpdatePanel, and during partial postback set the Text property of the content panel to the script you wish to run:

myLiteral.Text = "<script type=\"JavaScript\">doStuff();</script>";

IMO, a more proper way is to use the client-side API for async postbacks to register an event handler to run when the postback completes:

function endRequestHandler(sender, args) {
    doStuff();
}

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);

If you need to pass information which was generated during the postback into the handler, you can pass that via hidden fields and grab that from the DOM in your client-side handler.

Rex M
@Rex I was planning on using hidden fields and and event handler that always files, but was hopping there was a mechanism similar to one I described. From what I've found so far this is the only option.
Mark
@Rex I've written up how I used this method to accomplish the same goal. http://fooberry.com/2009/05/25/running-specific-javascript-after-partial-postback/
Mark
A: 

the best way to do this is to use the DoAfterPostBack control. you can download this control for free from here http://go2amitech.blogspot.com/2010/08/running-specific-javascript-after.html

Amit Panchal