我有一個 webforms 應用程式,它使用一個典型的檔案下載器頁面,可以從我的應用程式中的許多地方訪問。在正常情況下,頁面提供檔案,關閉,用戶甚至不知道它存在。但是,我添加了一個 PDF 轉換工具,可以將某些檔案轉換為 PDF,此程序需要幾秒鐘,因此最終用戶會看到該頁面,我對此表示滿意。
我正在嘗試向頁面添加一些簡單的文本和“正在加載”的 GIF,但在頁面加載事件開始并阻止頁面呈現之前,我無法讓它呈現。
我有一個簡單的頁面加載事件來決定運行什么程式。
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
If Not Me.IsPostBack Then
Dim Type As String = Request.QueryString("Type")
If Type = "File" Then
'TODO
ElseIf Type = "DB" Then
OpenDBFile()
ElseIf Type = "QCBDBYMCSID" Then
OpenQCBD("BYMCSID")
ElseIf Type = "QCBDBYNAME" Then
OpenQCBD("BYNAME")
Else
'TODO
End If
End If
End Sub
我試圖通過在頁面生命周期后期用一個事件替換 Me.Load 來延遲這一點,比如 Me.SaveStateComplete 并且沒有任何變化。
在客戶端,我嘗試了幾個不同的選項,使用和更新面板、一個 UpdateProgress 和一個使用 CSS 設定背景影像而不是影像標簽的普通 DIV,但沒有顯示任何內容。
這是我嘗試過的兩個示例。
<asp:UpdatePanel ID="UpdatePanel1" runat="server" >
<ContentTemplate>
<div style="text-align: center">
<h1 style="text-align: center;">MCS File Downloader</h1>
<asp:Image ID="Image2" ImageAlign="Middle" ImageUrl="~/MyPictures/colorchangearrowdown.gif" runat="server" />
<h3 runat="server" id="h3Text" style="text-align: center">Processing File...</h3>
</div>
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdateProgress ID="prgLoadingStatus" runat="server" DynamicLayout="true">
<ProgressTemplate>
<div id="overlay">
<div id="modalprogress">
<div id="theprogress">
<h1 style="text-align: center;">MCS File Downloader</h1>
<asp:Image ID="imgWaitIcon" runat="server" ImageAlign="AbsMiddle" ImageUrl="~/MyPictures/colorchangearrowdown.gif" />
<h3 runat="server" id="h3Text" style="text-align: center">Processing File...</h3>
</div>
</div>
</div>
</ProgressTemplate>
</asp:UpdateProgress>
任何幫助將不勝感激!
uj5u.com熱心網友回復:
好吧,你不能關閉,或隱藏,或者任何代碼后面的東西。你點擊一個按鈕,頁面就會被發送到服務器。然后運行后面的代碼,然后將頁面發送回。
后面的代碼永遠不會直接與用戶互動。頁面回發將整個頁面發送到服務器。當后面的代碼運行時,它可以修改控制元件、文本框等。但是,用戶看到的都是零,直到后面的所有代碼都完成了,然后整個頁面讓它回到客戶端,重新加載,JavaScrip重新運行,然后顯示頁面。因此,亂搞各種服務器端代碼是 100% 的浪費時間,而且是徒勞的。
然而,通過對頁面生命周期和回傳(所謂的往返)的簡單掌握,一些解決方案變得容易 - 實際上在這里非常容易。
所以,無論你想做什么?說點擊一個按鈕?然后添加客戶端事件和服務器端事件。
客戶端現在可以顯示微調器(影片 gif)或其他任何內容。事實上,在 99% 的情況下,您不需要任何代碼來隱藏該微調器或其他任何東西,因為所有服務器端代碼何時完成?好吧,一個全新的網頁副本從服務器上飛速下載,因此您可以免費重新繪制和重新加載整個頁面 - 包括您的隱藏微調器/gif 現在被隱藏了。
所以,在最簡單的層面上,在一個空白的新測驗頁面上嘗試這段代碼:
你不需要花哨的代碼,你不需要執行緒,你不需要太多任何東西。(但您確實需要簡單地掌握頁面回發的作業原理)。
因此,我們將在網頁上放置一個按鈕。我們將點擊那個按鈕,我們有一個長時間運行的服務器端按鈕代碼(比如 5 秒)。當后面的代碼完成后,微調器將消失。
所以,我們有這個標記:一個按鈕,然后是影片“gif”微調器:
<div id="MySpinner" runat="server" style="display:none">
<img src="Content/wait2.gif" />
</div>
<div id="MyGrid" runat="server" style="width:50%">
<asp:GridView ID="GridView1" runat="server" CssClass="table"></asp:GridView>
</div>
<asp:Button ID="cmdLoadGrid" runat="server" Text="Load data" CssClass="btn"
OnClientClick="ShowSpinner();return true;" />
</div>
<script>
function ShowSpinner() {
$("#MySpinner").show();
}
</script>
請注意我如何將微調器隱藏在 div 中(顯示:無)。
注意我們有一個平面簡按鈕,但它也有一個客戶端點擊事件。
后面的代碼是這樣的
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 處理 Me.Load
End Sub
Protected Sub cmdLoadGrid_Click(sender As Object, e As EventArgs) Handles cmdLoadGrid.Click
Thread.Sleep(4000) ' fake a big delay
Dim strSQL As String = "SELECT TOP 6 ID, FirstName, LastName, HotelName, City, Description from tblHotels
WHERE Description is not null"
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
所以我投入了 4 秒的“假”延遲。
所以,頁面看起來像這樣:

如果我點擊按鈕,我們會看到:

然后當服務器代碼完成后,它會發回整個頁面,我現在看到了:

請注意,我什至不必“隱藏”微調器 gif - 當后面的代碼完成后,它會恢復到其原始設定,并且整個 FRESH 頁面現在被發送回客戶端。
所以彈出你的 gif,或 toast 訊息,甚至是帶有“請稍候”的 jQuery 對話框。當服務器端代碼完成時,這一切都會被吹走,新的網頁又回到客戶端。
編輯:好的,假設您掌握了頁面生命周期?
因此,您可以在頁面加載中運行您想要的所有代碼 - 直到馬回家,但代碼和頁面仍然在服務器上。所以你必須讓頁面向下移動到客戶端。這意味著您的代碼必須完成修改和更改網頁。
然后只有然后頁面才會向下移動到客戶端并顯示。因此,您可以在任何情況下更改頁面上的內容,但只有在頁面下到客戶端之后,最終用戶才會看到更改后的代碼結果。
那么,這在簡單的解釋中意味著什么?
您必須讓頁面向下傳輸到客戶端。然后單擊一個按鈕以顯示您的訊息/gif,然后運行您的服務器端代碼。
所以,你可以這樣做:
首先吹出并轉儲您的更新面板-您不需要它們。
因此,您可以像這樣放入您的 div,以及一個隱藏欄位,以及一個單擊按鈕,然后單擊該按鈕將運行您的代碼(但是,代替用戶單擊按鈕,我們將獲取客戶端代碼以單擊那個按鈕給我們!!!)。
所以,你有這個:
<div id="theprogress" runat="server">
<h1 style="text-align: center;">MCS File Downloader</h1>
<asp:Image ID="imgWaitIcon" runat="server" ImageAlign="AbsMiddle" ImageUrl="~/MyPictures/colorchangearrowdown.gif" />
<h3 runat="server" id="h3Text" style="text-align: center">Processing File...</h3>
</div>
<asp:Button ID="cmdLoad" runat="server" Text="Button" ClientIDMode="Static" />
請注意上面的按鈕,因此,將您的代碼放在該按鈕中:例如:
Protected Sub cmdLoad_Click(sender As Object, e As EventArgs) Handles cmdLoad.Click
Dim Type As String = Request.QueryString("Type")
If Type = "File" Then
'TODO
ElseIf Type = "DB" Then
OpenDBFile()
ElseIf Type = "QCBDBYMCSID" Then
OpenQCBD("BYMCSID")
ElseIf Type = "QCBDBYNAME" Then
OpenQCBD("BYNAME")
Else
'TODO
End If
theprogress.Style.Add("Display", "none") ' hide progress when we are done
End Sub
那么,現在會發生什么?
頁面加載將注入一個按鈕點擊。代碼已完成,現在頁面將向下傳遞到客戶端 - 將顯示帶有您的進度 “影片”的 div。您在頁面加載中注入的 JavaScript 代碼現在將單擊該按鈕,并且會發生回發 - 但頁面會顯示,并將一直顯示,直到您的代碼完成,然后您的代碼隱藏影片。由于這暗示了某種可能的檔案下載,因此將隱藏進度 div 移動到按鈕單擊的第一行。
最后一個任務:一旦一切正常,然后隱藏頁面上的按鈕:
<asp:Button ID="cmdLoad" runat="server" Text="Button"
ClientIDMode="Static" style="display:none" />
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/430454.html
