问题是提交大量报告。基本上我们有很多数据可以在html报告中呈现(主要使用转发器或gridview)。事实上,数据开始很小,现在我们有大量的数据。已经建立了很多这样的报告,因此不能选择全部重写。哎呀,业务甚至没有让我们分页数据。 现在每次我们尝试渲染一些报告时,服务器内存都会出现。所以问题是 - 是否有某种方式我们可以将数据绑定到转发器,并在块准备就绪时将html流式传输到浏览器?这样我们希望不会立即将所有数据都带入应用服务器。我想我们将使用datareader或其他东西来获取部分数据并将其呈现给浏览器。任何指针,链接,想法?
答案 0 :(得分:2)
对于JQuery无限滚动,这将是一个有趣的解决方案。
http://www.infinite-scroll.com/
由于您不允许执行分页,因此您可以滚动抛出,然后只从数据库中提取并显示记录。其中一个问题是您需要使用JavaScript动态地向GridView控件添加行。
将其视为Google阅读器,您可以在其中向下滚动Feed,然后加载所有Feed。
答案 1 :(得分:0)
在这种情况下,Response.Write是你的朋友。不幸的是,你将放弃数据绑定和转发器的细节。这是一个链接http://highscalability.com/plentyoffish-architecture
答案 2 :(得分:0)
您有几个选项,但不能使用转发器来执行此操作。
ASP.NET在输出the rendering stage of the page lifecycle之前不会输出ASPX中定义的HTML。在此之前,几乎任何事情都可能发生在页面上(在Page_Init,Page_Load等中):它可能会添加或删除页面的控件,它可能绑定数据源等等。所以没有办法知道要发送到页面的内容客户端。
一个选项是使用AJAX从客户端构建报告:首先加载HTML,然后使用对服务器的增量调用对其进行修改,直到您使用了所有报告数据。那会让你把报告分成你想要的任何大小的块,但它可能会变得相当复杂。 (另一方面,也许有人已经建立了一个控制来促进这一点。)
另一个选项是控制您的HTML生成并在您的代码隐藏类中手动编写整个页面(而不是使用一个漂亮,易于阅读的.aspx模板)。要查看此操作,请创建一个完全空的.aspx(除了@Page
声明),并将其放在Page_Load
方法中:
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("<html><body><ul>");
// this could be iterating a data reader
for(int i=0; i<5; i++)
{
Response.Write("<li>Item " + i.ToString() + "</li>");
// you might tweak your buffer settings instead of flushing on
// each write - this is just for demonstration purposes
Response.Flush();
// this just dramatizes the fact that it's streaming
// by adding a two-second delay
System.Threading.Thread.Sleep(2000);
}
Response.Write("</ul></body></html>");
}