如何控制在UpdatePanel部分回发endRequest之后运行哪些JavaScript?

Mar*_*ark 6 javascript updatepanel asp.net-ajax

我知道我可以挂钩客户端事件,在每次部分回发后运行JavaScript; 但是,我想做这样的事情:

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

我知道我可以用隐藏的字段完全破解它并在每次回发后运行一些东西,但应该有一种非常直接的方式以类似的方式来实现这一点.

Rex*_*x M 9

您描述的特定代码示例不适用于部分回发,因为ClientScript.RegisterStartupScript()在请求生命周期的输出构建阶段将JS写入页面; 而部分回发只通过JavaScript更新页面的选定部分(即使整个页面的标记,包括您的启动脚本,也是在服务器上生成的).

要密切模仿您所描述的内容,您应该在UpdatePanel中包含一个Literal控件,并在部分回发期间将内容面板的Text属性设置为您要运行的脚本:

myLiteral.Text = "<script type=\"JavaScript\">doStuff();</script>";
Run Code Online (Sandbox Code Playgroud)

IMO,更合适的方法是使用客户端API进行异步回发,以便在回发完成时注册要运行的事件处理程序:

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

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
Run Code Online (Sandbox Code Playgroud)

如果需要将回发期间生成的信息传递给处理程序,可以通过隐藏字段传递,并从客户端处理程序中的DOM中获取.