我們現在試用一下這個組件。
首先,我們將AjaxUploadHelper控件放置在頁面中,緊跟在ScriptManager之後,因為AJaxUploadHelpe需要在第一時間告訴ScriptManager目前正處在一個異步刷新的過程中。
接著,在頁面上添加一個UpdatePanel,並在其中放置一個FileUpload控件,一個按鈕以及一個Label。為了更容易地看出異步刷新的效果,我們在頁面上添加兩個時間:
在Code Behind代碼中,我們為Button添加Event handler:
打開頁面,我們可以看到頁面中顯示了那些控件和兩個時間。
選擇一個文件並點擊Upload按鈕,我們可以發現只有UpdatePanel內部的時間被改變了,文件大小也顯示在了頁面上:
很震撼吧?但是如果我們改變Code Behind中的代碼:
刷新頁面,點擊按鈕,您就會發現……失敗了?為什麼?
原因如下:在一個“普通”的PostBack時,如果我們在執行了Redirect方法,浏覽器將會接受到一個Status Code為302的Response,以及一個跳轉目標。接著浏覽器就會將用戶帶去指定的目標頁面。當XHR發出的請求得到這樣一個Response之後,它將會自動重新請求而不會告訴客戶端究竟發生了什麼。這時,客戶端只能獲得目標跳轉之後的資源,而並非起初請求的資源。
因此,ASP.Net AJax提供了一個組件來支持異步PostBack時的跳轉。這個組件就是ScriptModule,我們可以在web.config文件中找到它的注冊信息。
下面的代碼片斷就是它解決這個問題的實現:
我們響應了PreSendRequestHeaders事件,它將會在服務器端發送Header信息之前被觸發。此時,如果Status Code為302(表示Response將要使客戶端跳轉到另一個頁面去),則會清除所有即將發送的內容,並重新指定傳輸的信息。在這裡最重要的修改就是Response Body的內容。因為客戶端將要解析收到的字符串,因此我們必須發送格式為“length|type|id|content”。請注意上方紅色的代碼,它將會發送一段格式合法的字符串,例如“16|pageRedirect||/AnotherPage.ASPx|”。
在客戶端,我們可以找到下面的實現,它的作用是在收到頁面重定向的信息之後跳轉頁面。請注意下方紅色的代碼:
明白了這點之後,我們也就能夠輕松地編寫一個這樣的模塊了:
上方紅色的代碼為我們的Module與ASP.Net Ajax中的ScriptModule之間唯一的區別。我們在web.config文件中注冊了AJaxFileUploadModule之後,我們在服務器端調用Redirect方法之後,在客戶端就能進行跳轉了。此時客戶端接收到的文本如下:
現在,我們終於完成了所有的組件。