【问题标题】:ASP.NET SQL 查询中加载动画
【发布时间】:2022-01-23 04:15:40
【问题描述】:

我有一个用 VB.NET 编写的 ASP.NET Webforms 应用程序。

在我的一个页面上,我需要在页面加载时从 SQL 数据库中检索多个数据部分,这需要很长时间。这些请求一个接一个地处理,而不是同时处理。我试图在页面加载时显示加载动画,而不是大多数浏览器中通常的默认空白页面。

我直接在页面的加载事件中执行 SQL 查询。无论如何在页面未加载时显示加载动画或div,而不是在完成加载时显示实际内容?

【问题讨论】:

  • 您可以在没有数据库查询的情况下打开页面,并在页面上使用 JavaScript 来请求数据。

标签: asp.net .net vb.net multithreading webforms


【解决方案1】:

是的,您可以这样做。但完全不清楚为什么这些查询需要很长时间?应该查看和优化它们。

请记住,您的代码永远不会与用户交互。该页面传输到 Web 服务器。后台代码运行并可以修改页面上的任何内容 - 当所有后台代码完成后,整个新页面将返回客户端浏览器。然后加载、刷新并显示。

那么,这意味着什么?你会说在页面上放一个按钮(我们可以隐藏它),但是为了测试让页面加载 - 但不要运行你的慢数据查询。

现在,当我们点击按钮时,我们可以让客户端浏览器代码显示动画,然后运行按钮背后的代码。完成后,页面将再次返回客户端。

因此,我们需要(必须)首先将整个页面加载到客户端浏览器。然后点击一个按钮。现在我们可以让用户点击那个按钮,或者我们可以让浏览器代码点击那个按钮。一旦我们得到这个工作,然后我们只需隐藏按钮。

所以,这意味着您必须将页面加载代码移到一个简单的 asp.net 按钮后面。让该代码工作。你现在可以说这样做:

这也意味着默认情况下,我们让页面显示微调器。我们的按钮后面的代码会将其关闭!!!

所以,我们可以有这个标记(我假设 jQquery - 我们不都是吗???)。

所以,这个标记:

        <div id="MySpinner" runat="server">
            <img src="Content/wait2.gif" />
        </div>

        <asp:Button ID="cmdLoadGrid" runat="server" Text="Button" ClientIDMode="Static" Style="display:none" />

        <div id="MyGrid" runat="server">
            <asp:GridView ID="GridView1" runat="server" CssClass="table"></asp:GridView>
        </div>

        <script>

            var isPostBack = <%=Convert.ToString(Page.IsPostBack).ToLower()%>;

            $(document).ready(function () {
                if (isPostBack == false) {
                   $('#cmdLoadGrid').click()
                }
            })
        </script>

所以,微调器 gif 清晰可见。页面加载 - 显示微调器,然后我们使用 JavaScript 单击按钮来加载网格。

我们的代码如下所示:

Protected Sub cmdLoadGrid_Click(sender As Object, e As EventArgs) Handles cmdLoadGrid.Click

    Thread.Sleep(4000)    ' for testing = remove

    Dim strSQL As String = "SELECT ID, FirstName, LastName, HotelName, City from tblHotels"

    Using conn As New SqlConnection(My.Settings.TEST4)
        Using cmdSQL As New SqlCommand(strSQL, conn)

            conn.Open()
            GridView1.DataSource = cmdSQL.ExecuteReader
            GridView1.DataBind()

        End Using
    End Using

    ' hide the spinner
    MySpinner.Style("Display") = "none"
    MyGrid.Style("Display") = "normal"

End Sub

所以,请注意我们如何将微调器放置在“div” - 服务器标记中,以便我们后面的简单代码可以运行 - 加载网格,然后显示网格,隐藏微调器。

所以,连接按钮 - 让它工作。然后用 display:none 隐藏它。我们还添加了一个自定义 js 函数来获取 isPostBack - 因为 JavaScript 没有该特性/功能。

但是,我会仔细研究一下为什么您的这些查询需要这么长时间 - 他们可能不应该这样做。

【讨论】:

  • 感谢您的精彩解释。我将研究应用程序的线程和回发。关于 SQL 查询,我必须最多执行大约 20 个 SQL 请求,这些请求是异步完成的,我相信这会占用大部分加载时间。如果我能同时执行所有这些请求,那就太好了。
  • 好吧,也许——但在所有后面的代码完成运行之前——网页被卡在服务器上——即使有等待和异步调用——如果你放入等待——你还在等待,并且无论如何,您的页面都无法返回给最终用户。您也许可以启动多个单独的线程来加快速度,但是如果使用多个单独的线程,那么您将很难将这些信息恢复到一个页面中。现在,毫无疑问,您可以加载页面,然后执行单独的 ajax 调用来获取数据 - 但您必须编写和连接相当多的 js 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2020-12-23
  • 1970-01-01
  • 2014-10-14
相关资源
最近更新 更多