1

我有一个 ASP.NET 2.0 页面,其中包含许多重复块,包括第三方服务器端控件(因此它不仅仅是纯 HTML)。就 CPU 和 RAM 而言,每一个的生成都非常昂贵。我目前正在为此使用标准的中继器控件。

这种简单的方法有两个问题:

  1. 整个页面必须在任何页面返回给客户端之前呈现,因此用户必须等待很长时间才能看到任何数据。(我用 写进度消息Response.Write,所以有反馈,但没有实际结果。)
  2. ASP.NET 工作进程必须同时将所有内容保存在内存中。这没有内在的需求:一旦处理了一个块,它就不会改变,因此它可以返回给客户端并且可以释放内存。

我想以某种方式一次将这些块返回给客户端,因为每个都是生成的。我正在考虑将Repeater 中的内容提取到一个单独的页面中并使用AJAX 重复获取它,但其中涉及一些复杂性,我想知道是否有一些更简单的方法。理想情况下,我希望将其保留为一页(从客户的角度来看),但要逐步返回。

另一种方法是在服务器上做类似的事情:仍然创建一个单独的页面,但让服务器访问它,然后Response.Write()将 HTML 获取到真正客户端请求的响应流。不过,有没有办法在这里避免 HTTP 请求?是否有一些 ASP.NET 方法可以在 HTTP 请求之外呈现 UserControl 或 Page 并简单地将 HTML 作为字符串返回给我?

我也对如何做到这一点持开放态度。

4

3 回答 3

1

另一种方法是在服务器上做类似的事情:仍然创建一个单独的页面,但让服务器访问它,然后 Response.Write() 它获取的 HTML 到达真正客户端请求的响应流。

如果您将每个转发器行的内容提取到 UserControl 中,则可以执行此操作。然后,您可以使用LoadControl方法动态加载控件(如果需要),为其提供应呈现的正确数据(必要时调用 DataBind),然后使用Render方法将其呈现到响应流。这基本上是您的想法,没有创建一个全新的请求的混乱。

免责声明: 就总执行时间而言,我不知道这是否会比您当前的解决方案执行得更好或更差。

于 2010-05-13T01:42:59.230 回答
0

这种方式不使用 AJAX:

<div><script src="pageparts.aspx?partid=news"/></div>
<div><script src="pageparts.aspx?partid=weather"/></div>
<div><script src="pageparts.aspx?partid=email"/></div>

它的工作方式:pageparts.aspx发出构造页面相关部分的 javascript。零件不会以任何可预测的顺序出现。您可能需要修复部件的布局,以便页面在填充时不会跳动很多。

结果类似于 iGoogle.com(这就是我使用这些 URL 的原因)。

您的服务器端代码如下所示:

<asp:Repeater id="rpParts" runat="server">
    <ItemTemplate>
        <div><asp:Literal id="litPart" runat="server"/></div>
    </ItemTemplate>
</asp:Repeater>

您在<script>代码隐藏中生成标签。所有实际构建数据并将其放入大数据中的document.write()代码pageparts.aspx

如果您将一个大型数据库查询分解为许多小型查询,这可能不起作用,因为它最终可能会花费更长的时间。

编辑

整个问题在于“实际构造数据的代码”!如果我能把它当作一个字符串

这对我来说没有多大意义。您目前正在向客户发送什么,以及您是如何构建它的?

此外,为了完整起见,这里是一个纯粹的非 JavaScript 方法:

<div><iframe src="part1.aspx"/></div>
<div><iframe src="part2.aspx"/></div>
<div><iframe src="part3.aspx"/></div>

这很难看,通常看起来,即使您无法控制数据,它也会起作用。

于 2010-05-13T02:25:27.833 回答
0

对 web 服务进行 ajax 调用以获取部分 html 结果。您可以使用此处描述的 ViewManager 在您的 Web 服务中呈现 Web 控件并返回生成的 html。

http://weblogs.asp.net/scottgu/archive/2006/10/22/Tip_2F00_Trick_3A00_-Cool-UI-Templating-Technique-to-use-with-ASP.NET-AJAX-for-non_2D00_UpdatePanel-scenarios.aspx

于 2010-05-13T02:28:32.280 回答