我有一个带有一个控件(.ascx)的ASP.NET页面。页面(.aspx)onload为一些标签分配一些文本,并将产品ID传递给.ascx控件。 .ascx控件onload从.aspx页面获取该产品ID并多次访问数据库,进行多次计算等 - 基本上需要很长时间才能加载。
因此,当我点击此.aspx页面的链接时,页面加载需要7-10秒。我把它缩小到.ascx控件的计算是罪魁祸首,我尽可能地优化了代码......但它仍然花了太长时间。
有没有办法在控件加载之前加载.aspx页面? (也许会显示“正在加载...”动画?就像在UpdateProgress中使用一样?)
答案 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正在将控件集成到页面中,以便它等待,它具有响应所需的一切。
你可以通过多种不同的方式做到这一点:
执行此操作的最佳方法是使用iFrame(或类似的东西),它将指示浏览器在主页发送后请求控件。
答案 2 :(得分:1)
就个人而言,我永远不会使用iFrame来加载页面上的内容 - 这更像是一个黑客而不是任何东西加上iframe ==“bad”。
但他们是对的,你将无法做任何你想要的事情。
如果用户控件没有任何导致回发的Web控件(或者在回发期间需要访问任何表单控件),那么我会在页面已经使用后使用AJAX来请求服务器上的数据加载并使用javascript显示页面上的内容。