【问题标题】:How do I display a "please wait" message during a long operation in ASP.NET?如何在 ASP.NET 中长时间操作期间显示“请稍候”消息?
【发布时间】:2012-03-03 18:00:30
【问题描述】:

当第一次调用页面时,我希望在他们等待页面加载时显示“请稍候”消息。但是,在下面的示例中,页面在 someLongProcess 完成之前不会呈现。

我怀疑我需要使用 AJAX 之类的东西来显示初始的“请稍候”消息,然后开始我的初始处理。有什么建议吗?

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        Call SetupGUI() 'user doesnt see this setup until page is rendered.
        Call someLongProcess()
    End If
End Sub

【问题讨论】:

    标签: asp.net ajax asp.net-ajax


    【解决方案1】:

    在我解释之前,让我先描述一下你的方法有什么问题,你如何完成你的任务

    当您编写这段代码时,您假设客户端和服务器以某种方式连接并且可以在需要时相互通信。可悲的是,事实并非如此。 HTTP 是一种无状态协议。您可能想知道,无状态协议是什么意思?

    假设服务器是 James,他有电话线,但没有来电显示。他每天都会接到数千个来自不同客户的电话,询问一个问题。现在James知识渊博,可以快速回答这些问题,但是一旦他从客户那里打折,他就无法回电(记住没有来电显示,意味着James无法回电客户)。

    这一切都好,当您有简短的问题要问但如果您有问题需要詹姆斯考虑答案时,您要么需要在线等待,詹姆斯思考,要么您希望詹姆斯给您回电。

    为了在电话上等待,您需要增加 webconfig 中的 ASP.Net executionTimeOut 值。默认值为 110 秒,当您等待答案时,您可以使用以下代码显示加载/进度微调器

    <div id="preloader" style="width: 100%; text-align: center;">
                        <img src="../Images/loading.gif" alt="" style="display: block;" />
                    </div>
    
    <script language="javascript" type="text/javascript">
        function HidePreloader() {
            if (document.getElementById('preloader') != null) {
                document.getElementById('preloader').style.visibility = 'hidden';
    
            }
        }
    </script>
    

    只需在按钮/链接点击时调用函数 HidePreloader。

    这都是笨拙的多莉,但请记住詹姆斯是个老家伙,他只能同时听 10 个电话。如果那时已经有 10 个人接听了 James,那么他将无法接听第 11 个电话。这不好,我们想要的是詹姆斯给我们回电话的方式。我们想给 James 一个来电显示。遗憾的是,来电显示在 Windows 8 服务器之前将不可用,并且仅对支持 websockets 的客户端(浏览器)可用。

    那么我们还能做什么,我们如何解决这个问题,哦等等,如果我们给詹姆斯我们的名字并告诉他怎么办,我会在 5 分钟内回电,看看你是否找到答案。这称为轮询。基本上你要求服务器完成一个长时间运行的任务,服务器会给你令牌。每隔几分钟或几秒钟,你就会问服务器,这是我的令牌,我的任务是否完成。如果任务完成,您将使用新数据填充页面。传统上,这是使用 Javascript 和 Web 服务完成的。你也可以看看这个框架SignalIR,它提供了完成这类事情的方法。

    希望这种心智模型能帮助您更好地理解 HTTP 的无状态特性。

    【讨论】:

      【解决方案2】:

      您将看到如何为这个要求创建一个异步页面。 http://msdn.microsoft.com/en-us/magazine/cc163725.aspx 这里有一篇很好的文章,很好地解释了这个过程。这是一篇较旧的文章,因此值得一试。另外,请查看 PageAsyncTask 类http://msdn.microsoft.com/en-us/library/system.web.ui.pageasynctask.aspx

      上面的链接应该让您朝着正确的方向前进。

      【讨论】:

        【解决方案3】:

        您提到了 AJAX。如果你想用 JavaScript 来做,可能是这样的:http://pure-essence.net/2010/01/29/jqueryui-dialog-as-loading-screen-replace-blockui/

        【讨论】:

          猜你喜欢
          • 2013-01-14
          • 2012-09-12
          • 2014-05-12
          • 1970-01-01
          • 1970-01-01
          • 2011-05-12
          • 2012-01-09
          • 1970-01-01
          • 2010-12-27
          相关资源
          最近更新 更多