ScriptManager.RegisterStartupScript内部while循环仅在断开循环后执行

时间:2014-01-01 18:49:59

标签: asp.net while-loop scriptmanager registerstartupscript

我的代码隐藏中有一个while循环,我想监视进度,所以每次进入循环,我希望我的页面绘制一些东西(一个点),当循环中断时,我会看到整个进度( scatterplot)我的代码如下:

          while (iter <= Common.maxIter)
          {
            ScriptManager.RegisterStartupScript(this, this.GetType(), "myFunc" + iter.ToString(), "Display()", true);

            //doing something else
           }

函数Display()每次绘制一个点。我的问题是,只有在我打开while循环之后,所有的条形图同时被绘制,但是它们都没有在循环中被绘制...... :(我不知道哪里出了问题,如果我使用断点,我可以看到这个代码每次都被执行,只是没有显示在我的页面上。

任何人都知道这样做的正确方法是什么?非常感谢!

1 个答案:

答案 0 :(得分:2)

此代码为“服务器端”代码:

while (iter <= Common.maxIter)
          {
            ScriptManager.RegisterStartupScript(this, this.GetType(), "myFunc" + iter.ToString(), "Display()", true);

            //doing something else
           }

虽然这是“客户端”代码:

"myFunc" + iter.ToString(), "Display()"...

ASP.NET的工作方式是在“服务器端”执行一系列事件,这也称为“页面生命周期”。您可能已经知道其中一些事件,只是为了给您一些这些事件的例子:PreInit,Init,PreLoad,Load,PreRender,Render和UnLoad。

我想说最常用的是页面加载事件,我想你的代码示例也放在该方法中。

如果您查看this event的文档,请解释您所面临的问题,让我们专注于“渲染”事件:

protected override void Render(HtmlTextWriter output) {
    if ( (HasControls()) && (Controls[0] is LiteralControl) ) {
        output.Write("<H2>Your Message: " + ((LiteralControl) Controls[0]).Text + "</H2>");
    }
}

您会注意到此事件使用“ HtmlTextWriter ”,它基本上是一个Stream。我之所以强调它的原因是因为您在页面生命周期中对控件或页面执行的每个操作/修改都将在页面生命周期结束时写入此流,此流将作为html发送回用户。

所以,回到你的问题,你正在做的是在HTML流中添加“javascript”,然后发送给用户。因此,当页面生命周期结束时,它将立即向用户发回*。

  • *有一个方法Response.Flush()可以用于部分渲染,但我认为它也不会解决你的问题,这是我之前提到的一些语句中我唯一的例外。