【问题标题】:Allow .ASPX page to display before .ASCX control finishes loading?允许 .ASPX 页面在 .ASCX 控件完成加载之前显示?
【发布时间】:2011-03-25 19:09:03
【问题描述】:

我有一个带有一个控件 (.ascx) 的 ASP.NET 页面。页面 (.aspx) onload 将一些文本分配给几个标签,并将产品 ID 传递给 .ascx 控件。 .ascx 控件 onload 从 .aspx 页面获取该产品 ID 并多次访问数据库,进行多次计算等 - 基本上需要很长时间才能加载。

因此,当我单击指向此 .aspx 页面的链接时,页面加载需要 7-10 秒。我已将其范围缩小到 .ascx 控件上的计算是罪魁祸首,并且我已尽我所能优化代码......但它仍然花费了太长时间。

有没有办法在控件加载之前加载 .aspx 页面? (也许显示“正在加载...”动画?就像在 UpdateProgress 中使用的那样?)

【问题讨论】:

  • 您可以考虑发布需要 7 秒左右才能执行的代码。这是运行一些计算和查询的大量时间。听起来数据库可能需要一些更好的索引

标签: c# asp.net user-controls ascx


【解决方案1】:

您可以使用 UpdatePanel 来执行此操作。这需要一些技巧,但请尝试以下操作:

1) 将UserControl 放入UpdatePanel。

2) 在您的用户控件上放置一个公共属性,例如IsEnabled,它将用于有条件地不执行任何操作或呈现“请稍候”。从您的主页将其设置为 false。

3) 将OnInit 中的一些代码添加到您的主页:

if (MyScriptManager.IsInAsyncPostback) {
    MyUserControl.IsEnabled=true;
}

4) 按照以下方式添加客户端脚本:

finished=false;
Sys.WebForms.PageRequestManager.pageLoaded(function(sender,args) {
    if (!finished) {
      finished=true;
      __doPostBack('','');
      // you can include the uniqueID of your updatepanel as the first arg 
     // otherwise it will refresh all update panels
    }
});

或使用 jquery..

finished=false;
$(document).ready(function() {
   if (!finished) {...
   }
});

这样做应该是在页面加载完成后立即启动异步回发,这反过来又会导致更新面板被刷新。由于您将其设置为在异步回发时启用,因此它将在第二次呈现自己。

【讨论】:

    【解决方案2】:

    实现此目的的唯一可能方法是将其设置为单独的 HTTP 资源。目前 .NET 正在将控件集成到页面中,因此它正在等待它拥有响应所需的一切。

    您可以通过多种不同的方式做到这一点:

    • 通过 javascript 调用的 Web 服务
    • 包含控件的单独页面(并且托管在 iFrame 中以显示在同一页面上)

    最好的方法是使用 iFrame(或类似的东西),它会指示浏览器在发送主页后请求控件)。

    【讨论】:

      【解决方案3】:

      就个人而言,我绝不会使用 iFrame 在页面上加载内容 - 这更像是一种 hack,而且 iframe == "bad"。

      但他们是对的,你将无法做任何你想要的事情。

      如果用户控件没有任何会导致回发的 Web 控件(或者没有在回发期间需要访问的任何表单控件),那么我会在页面已经完成后使用 AJAX 来请求服务器上的数据加载并使用 javascript 在页面上显示内容。

      【讨论】:

        猜你喜欢
        • 2010-12-23
        • 1970-01-01
        • 2014-08-26
        • 1970-01-01
        • 1970-01-01
        • 2015-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多