1

假设我有一个按钮可以修改更新面板中的一些内容:

protected void Button1_Click(object sender, EventArgs e)
{
    Label1.Text = "New Text";
}

在 UpdatePanel 更新后,我还想在客户端执行一些代码。我的第一个想法是执行ScriptManager.RegisterClientScriptBlockRegisterStartupScript

protected void Button1_Click(object sender, EventArgs e)
{
    Label1.Text = "New Text";

    var x = getSomeDatabaseQueryResultBasedOn(TextBox1.Text, ...);

    ScriptManager.RegisterStartupScript(this, typeof(WebForm1), "SomeKey",
        "/* this is my script, using `x` */", true)
}

但是,RegisterStartupScript 的文档说:

您可以使用此方法注册一个启动脚本块,每次发生异步回发时都会包含该脚本块。

我不希望这段代码执行“每次发生异步回发”。我希望它现在才执行(在浏览器重新控制之后)。如果单击 Button2,我不希望执行任何脚本,如果再次单击 Button1,x可能会有所不同,我希望执行一个脚本。不幸的是,我没有找到ScriptManager.ExecuteOnce方法。

有没有这样的方法?还是我只是误解了 的文档RegisterStartupScript

4

2 回答 2

0

当您在异步回发期间包含 StartupScript 时,它只会存在于从服务器发送的部分响应中。

如果你做这样的事情:

if(ScriptManager.IsInAsyncPostBack)
{
  myDiv.InnerText = "partial response";
  ScriptManager.RegisterStartupScript(Page, Page.GetType(), DateTime.Now.ToString("ssfff"), "alert(0);"), true);
}

您的回复将如下所示:

|blabla|blabla|updatePanel_ctrl00|someparams
<div>partial response</div>
<script> alert(0); </script>

因此,一旦收到响应,那段 javascript 就会执行。

于 2012-04-04T19:09:43.260 回答
0

该文档的下一行说:

“要为 UpdatePanel 控件内的控件注册脚本块,以便仅在更新 UpdatePanel 控件时注册脚本,请使用此方法的 RegisterClientScriptBlock(Control, Type, String, String, Boolean) 重载。”

这不是你想要的吗?

于 2012-04-04T16:24:57.360 回答