允许.ASPX页面在.ASCX控件完成加载之前显示?

时间:2011-03-25 19:09:04

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

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

因此,当我点击此.aspx页面的链接时,页面加载需要7-10秒。我把它缩小到.ascx控件的计算是罪魁祸首,我尽可能地优化了代码......但它仍然花了太长时间。

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

3 个答案:

答案 0 :(得分:2)

您可以使用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) {...
   }
});

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

答案 1 :(得分:1)

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

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

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

执行此操作的最佳方法是使用iFrame(或类似的东西),它将指示浏览器在主页发送后请求控件。

答案 2 :(得分:1)

就个人而言,我永远不会使用iFrame来加载页面上的内容 - 这更像是一个黑客而不是任何东西加上iframe ==“bad”。

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

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