C# 是否允许在.ASCX控件完成加载之前显示.ASPX页?

C# 是否允许在.ASCX控件完成加载之前显示.ASPX页?,c#,asp.net,user-controls,ascx,C#,Asp.net,User Controls,Ascx,我有一个ASP.NET页面,上面有一个控件(.ascx)。页面(.aspx)onload将一些文本分配给一对标签,并将产品ID传递给.ascx控件。.ascx控件onload从.aspx页面获取该产品ID,并多次访问数据库,进行多次计算,等等—加载基本上需要很长时间 因此,当我单击指向此.aspx页面的链接时,页面加载需要7-10秒。我已经把它缩小到.ascx控件上的计算,这是罪魁祸首,我已经尽可能优化了代码。。。但还是要花很长时间 是否有办法在加载控件之前加载.aspx页?(可能会显示“加载…

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

因此,当我单击指向此.aspx页面的链接时,页面加载需要7-10秒。我已经把它缩小到.ascx控件上的计算,这是罪魁祸首,我已经尽可能优化了代码。。。但还是要花很长时间


是否有办法在加载控件之前加载.aspx页?(可能会显示“加载…”动画?就像在UpdateProgress中使用的一样?

实现这一点的唯一可能方法是将其设置为单独的HTTP资源。目前.NET正在将控件集成到页面中,这样它就可以一直等待,直到它拥有所有需要响应的内容

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

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

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

实现这一点的唯一可能方法是将其设置为单独的HTTP资源。目前.NET正在将控件集成到页面中,这样它就可以一直等待,直到它拥有所有需要响应的内容

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

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

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

就我个人而言,我永远不会使用iFrame在页面上加载内容——这更像是一种黑客行为,而且iFrame==“坏”

但是他们是对的,你不能做任何你想要的事情


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

,我永远不会使用iFrame在页面上加载内容——这更像是一种黑客行为,而且iFrame==“糟糕”

但是他们是对的,你不能做任何你想要的事情


如果用户控件没有导致回发的任何web控件(或在回发过程中需要访问的任何表单控件),那么我将使用AJAX在页面加载后请求服务器上的数据,并使用javascript在页面上显示内容。

您可以使用UpdatePanel来实现这一点。这需要一些技巧,但请尝试以下方法:

1) 将
UserControl
放入
UpdatePanel

2) 在usercontrol上放置一个公共属性,如
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) {...
   }
});

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

您可以使用UpdatePanel来实现这一点。这需要一些技巧,但请尝试以下方法:

1) 将
UserControl
放入
UpdatePanel

2) 在usercontrol上放置一个公共属性,如
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) {...
   }
});

这将导致在页面加载完成后立即启动异步回发,从而刷新更新面板。因为当它在异步回调中设置为启用时,它将呈现第二次。

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