我想在webcontrol中使用某种逐步渲染,这是一个例子(不按预期工作)
public class Price : WebControl
{
protected override void Render(HtmlTextWriter output)
{
HttpResponseBase response = new HttpResponseWrapper(new HttpResponse(output));
//Panel basePanel = new Panel() { ID = "basePanel" };
//Controls.Add(basePanel);
//var loaderImage = LoaderAnimation();
//Controls.Add(loaderImage);
System.Threading.Thread.Sleep(500);
Controls.Add(new LiteralControl("aaa "));
response.Flush();
System.Threading.Thread.Sleep(500);
Controls.Add(new LiteralControl("bbb "));
response.Flush();
System.Threading.Thread.Sleep(500);
Controls.Add(new LiteralControl("ccc "));
base.RenderContents(output);
}
}
这应该在每次冲洗时呈现。也许这是一种可怕的技术,但我喜欢这方面的一些建议。
答案 0 :(得分:3)
您的方法可能无法按预期工作。如果你想逐步渲染(我不是要求为什么),你应该解决类似AJAX的问题。
涉及太多(网络,在客户端和服务器端缓冲,在浏览器中呈现,这非常依赖于当前等其他元素的结束标记),您可以使用一种方法,只需暂停生成内容间歇性地。
如果要在服务器上显示类似于较长时间进程的进度,请让另一个后台线程执行该操作,让客户端每X秒轮询一次以获取更新。 JSON和AJAX是您的朋友,您可以向用户显示缓慢增长的页面/内容。
这具有额外的效果,您可以首先渲染整个页面(即包含html结束标记的有效HTML),然后在HTML页面的中间更新部分。
答案 1 :(得分:1)
要按照您尝试的方式执行此操作,您需要使用(可能).ToString()调用来呈现控件。然后,在调用response.Flush()之前调用response.Write(yourString)。
Abel提到的方法是IMO,它是一个更好的方法。
这篇博客文章表明你需要两次调用response.Flush ......这可能与你正在做的事情有关。当我需要做类似的事情时,我已经使用了Abel的方法。