1

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

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

            //doing something else
           }

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

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

4

1 回答 1

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。

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

为了解释您面临的问题,让我们关注“渲染”事件,如果您查看此事件的文档:

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

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

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

  • *有一种方法 Response.Flush() 可用于部分渲染,但我认为它也不能解决您的问题,这是我之前提出的一些陈述的唯一例外。
于 2014-01-01T20:02:49.343 回答