我有一些处理,第一次在服务器上加载页面时可能需要5秒多的时间。这是一个我无法控制的外部约束,因为它发生在可以添加到我无法控制的服务器上的任何页面的WebPart中,我无法在更大的范围(例如应用程序)中执行此处理。
我希望页面显示进度,而在更新面板中发生部分回发,而不是在看到任何内容之前等待页面加载的用户。该回发背后的代码将完成繁忙的工作。
我尝试过使用ajax计时器,除非在回发后面的代码中抛出异常,否则效果很好。
总之,我想知道如何在客户端加载页面后立即执行一次部分回发。
答案 0 :(得分:2)
我想出来了。要通过UpdatePanel部分回发到服务器而不使用隐藏控件,请使用jQuery执行此操作:
<script type="text/javascript">
$(document).ready(function () {
__doPostBack('<%=UpdatePanel1.ClientID %>');
});
</script>
一旦HTML DOM准备就绪,这将使用ID UpdatePanel1对UpdatePanel执行部分回发。然后,您可以使用ASP.NET页面生命周期来挂钩适合您的任何事件。我迷上了更新面板的加载事件:
protected void UpdatePanel1_Load(object sender, EventArgs e)
{
if (Page.IsPostBack && Session["InitializedKey"] == null)
{
Session["InitializedKey"] = true;
// do your initialization stuff here
}
}
上述代码仅在页面回发且设置了会话变量时才会运行。现在,您必须在用户刷新页面时清除会话变量,因为此处的目的是在第一个回发上运行此代码并且仅在第一个回发时运行此代码。所以清除Page_Load中的会话变量:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
Session[initializedKey] = null;
}
如果您想在页面部分回发时显示进度指示器,请执行以下操作javascript:
<script type="text/javascript">
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_beginRequest(BeginRequestHandler);
prm.add_endRequest(EndRequestHandler);
function BeginRequestHandler(sender, args) {
if (args._postBackElement.id == '<%=UpdatePanel1.ClientID %>') {
$get('Progress').className = 'Progress';
}
}
function EndRequestHandler(sender, args) {
if (sender._postBackSettings.sourceElement.id == '<%=UpdatePanel1.ClientID %>') {
$get('Progress').className = 'Hidden';
}
}
</script>
这需要一个id为'Progress'的div标签,以及你想在该div中显示进度的任何内容。您还需要一些css来在名为Hidden和Progress的类中设置div标签上的显示和可见样式。不要忘记对部分回发执行错误处理!