1

我目前在我的 ASP.net Web 表单站点中有两个页面。在第一页,用户可以输入一些详细信息,然后按一个按钮。然后,这将 response.redirect 到与它一起发送用户详细信息的下一页。

下一页的页面加载为

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {   
            GetInformation();        
        }
    }

GetInformation() 使用这些用户详细信息进行长时间的处理,大约需要 15-20 秒。

发生的情况是当用户按下第一页上的按钮时,它会停留在第一页上,直到 GetInformation() 完成运行,然后它将加载新页面。

我想要做的是,当用户按下按钮时,新页面出现,然后有一个覆盖说加载或其他东西,然后让它启动 GetInformation()。GetInformation 完成后,覆盖将消失。

我在 Google 上进行了搜索,看到了一些想法,但似乎没有一个真正适合我的问题。

这样做的最佳方法是什么?

4

2 回答 2

1

非常简单的解决方案:

  1. 创建一个新页面Loading.aspx。添加适当的样式和所有内容,使其看起来像您预期的加载页面。

  2. 在此页面中,在标签中添加以下<head>标签:<meta http-equiv="refresh" content="0;URL='LongLoadingPage.aspx'" />

现在不是LongLoadingPage.aspx直接重定向到,而是重定向到Loading.aspx页面。

当然,这是一个快速的解决方案,可能有一个更好的解决方案,您可以使用 AJAX 请求(使用UpdatePanel或 vanilla XMLHttpRequest)初始化长时间运行的操作。

于 2013-03-08T12:53:23.493 回答
1

page_load只有在事件完全执行后才会显示页面。所以不要在事件中调用你的函数。page_load而是使用计时器控件来触发你的函数调用。

假设您添加了一个计时器控件,例如

<asp:Timer ID="tmr" runat="server" Interval="3000" OnTick="tmr_Tick" Enabled="true">
</asp:Timer>

现在服务器端代码看起来像这样

protected void tmr_Tick(object sender, EventArgs e)
{
    tmr.Enabled = false;
    GetInformation();        
    loadingIndicator.Style.Add("display", "none");
}

现在为了显示加载指示器在页面上放置一个这样的 div

<div id="loadingIndicator" runat="server" style="background-image:url(ajax-loader-small.gif);background-repeat: no-repeat; width: 100%; height: 104px; background-position: center;">
</div>

默认情况下会显示加载指示器,当GetInformation()完成执行后,我们可以更改显示

希望这可以帮助....

于 2013-03-08T12:58:48.957 回答