1 概述
ScriptManager 控制項管理用於 Microsoft ASP.NET AJAX 頁面的用戶端指令碼。預設情況下,ScriptManager 控制項將 Microsoft AJAX 庫的指令碼與頁面註冊到一起,這使指令碼可以使用類型系統擴充並支援局部頁面輸出和 Web 服務調用。
在頁面中,必須使用 ScriptManager 控制項來使下列 Microsoft ASP.NET AJAX 的特性可用:
- Microsoft AJAX 庫的用戶端指令碼功能,以及任何要發送到瀏覽器的定製指令碼。
- 部分頁面輸出,這使頁面中的某個地區可以不依賴於回送就可以重新整理。ASP.NET AJAX 的 UpdatePanel 、UpdateProgress 和 Timer 控制項需要 ScriptManager 控制項來支援局部輸出。
- Web 服務的 Javascript 代理,這使用戶端指令碼可以訪問由強型別的 Web 服務暴露出來的方法。
- Javascript 類訪問 ASP.NET 認證和個人化應用服務。
1.1 使部分頁面輸出可用
當頁面中有一個或多個 UpdatePanel 控制項時,ScriptManager 控制項將管理在瀏覽器中的局部頁面輸出。控制項與頁面組建循環互動來更新包含在 UpdatePanel 控制項中的局部頁面。
ScriptManager 控制項的 EnablePartialRendering 屬性決定了頁面是否可以進行局部更新。預設情況下,EnablePartialRendering 的值為 true,因此,在預設情況下添加了一個 ScriptManager 控制項到頁面中時,局部輸出是可用的。
1.2 錯誤處理
在局部輸出期間,可以使用下列方法來處理錯誤:
- 設定 AllowCustomErrorsRedirect 屬性,它決定了在非同步回傳期間發生錯誤時,如何使用 Web.config 檔案的定製的錯誤節。
- 處理 ScriptManager 控制項的 AsyncPostBackError 事件,它在非同步回傳期間出現分頁錯誤時觸發。
- 設定 AsyncPostBackErrorMessage 屬性,這是發送到瀏覽器的錯誤資訊。
1.3 使用類型系統擴充
Microsoft AJAX 庫添加了 Javascript 的類型系統擴充,提供了命名空間、繼承、介面、枚舉、反射以及用於字串和數組的協助工具功能。這些擴充提供了在用戶端指令碼中的功能使其看起來像是 .NET 架構。它使你可以使用結構化的方式來編寫ASP.NET 2.0 AJAX 擴充應用程式,以增強可維護性、使得更易於添加特性和劃分功能層次。將 ScriptManager 控制項到 ASP.NET Web 頁面會自動包含類型系統擴充,所以可以在用戶端指令碼中使用庫。
1.4 註冊定製指令碼
使用 ScriptManager 管理那些為參與局部頁面更新的控制項而建立的資源,資源套件括指令碼、樣式、隱藏欄位和數組。ScriptManager 控制項的 Scripts 集合包括了每一個瀏覽器可用的指令碼的 ScriptReference 對象。可以用聲明或編程來指定指令碼。
ScriptManager 控制項還提供了可以用來以編程的方式管理用戶端指令碼和隱藏欄位的註冊方法。在註冊支援局部頁面更新的指令碼和隱藏欄位時,必須調用 ScriptManager 的註冊方法。(要註冊不是局部頁面更新所需要的指令碼時,可以使用 ClientScriptManager 類。)
注意:
任何在頁面中由 ScriptManager 控制項註冊的指令碼和所有事件處理指令碼都必須包含在頁面中的 <form> 元素中,否則,指令碼將不會被註冊或執行。
1.5 註冊 Web 服務
ScriptManager 控制項的 Services 集合中包含了每個使用 ScriptManager 註冊的 Web 服務的 ServiceReference 對象。ASP.NET AJAX 架構為 Services 集合中的每個 ServiceReference 對象產生一個用戶端代理對象。代理類和它的強型別成員簡化了用戶端指令碼使用 Web 服務。
可以在運行時用編程的方式添加 ServiceReference 對象到 Services 集合中,以註冊 Web 服務。
1.6 在用戶端指令碼中使用認證和個人化服務
Microsoft AJAX 庫包含了直接從 Javascript 中調用 ASP.NET 2.0 表單認證和個人化應用服務的代理類。如果要使用定製的認證服務,可以使用 ScriptManager 控制項來註冊。
1.7 ScriptManagerProxy 類
在一個頁面中只能添加一個 ScriptManager 控制項。頁面可以直接包含控制項,或者包含在嵌套的組件中,如使用者控制項、主版頁面中的內容頁或者嵌套的主版頁面。當頁面中已經有一個 ScriptManager 控制項,而嵌套的或父組件需要 ScriptManager 控制項的其他特性時,組件就可以包含一個 ScriptManagerProxy 控制項。例如,ScriptManagerProxy 控制項可以使你添加僅用於嵌套組件的指令碼和服務到相應組件中。
2 添加 ScriptManager 控制項
直接將 ScriptManager 控制項從工具箱中拖到頁面的 <form> 元素中即可得到如下的元素引用,這樣,在它所有的頁面就可以使用 ASP.NET AJAx 了。
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
3 用戶端指令碼管理樣本
3.1 和 3.2 分別展示了將單個程式集中嵌入的指令碼或者獨立的指令檔添加到頁面中的方法,如果要同時添加多個指令碼,任意按這二個方法在 <Scripts> 元素中添加多個 <asp:ScriptReference>元素即可。
3.1 添加程式集中內嵌的指令碼
如下代碼展示了向頁面中添加嵌入到 Microsot.Web.Preview 程式集中的 PreviesScript.js 指令檔。
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Assembly="Microsot.Web.Preview" Name="PreviesScript.js" />
</Scripts>
</asp:ScriptManager>
3.2 添加單獨的指令檔
下列代碼展示了向頁面中添加單獨的指令檔 ~/ScriptPath/ScriptFile.js ,可以將它替換成自己所需要的指令檔使用。
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Path="~/ScriptPath/ScriptFile.js" />
</Scripts>
</asp:ScriptManager>
3.3 ScriptManager 的相關屬性
ScriptMode:
ScriptManager 和 ScriptReference 對象都具有 ScriptMode 屬性,它決定向用戶端所發送的指令碼的版本是 Debug 的還是 Release 的。它有四個可選的值:Inherit、Auto、Debug 和 Release。Debug 和 Release 的意義非常明確,就不再解釋。Inherit 表示繼承外層的設定,對於ScriptManager 來說,相當於 Auto。Auto 表示根據當前的編譯模式及 Web.config 中的相關設定來自動決定指令碼的版本。
ScriptPath :
用於指定頁面中所有指令碼塊的相對的、絕對的或應用程式相關的 URL,這包括由當前 ScriptManager 執行個體註冊的定製的或第三方指令碼塊。如果 Scripts 集合中的 ScriptReference 設定了 Path屬性,Path 屬性將覆蓋 ScriptPath 的設定。如果沒有設定此屬性且ScriptReference 指定的是程式集的話,每次請求指令碼時都將用 WebResource.axd 從程式集中解析出指令碼後再發回瀏覽器,而設定後將直接使用 ScriptPath 下的 js 檔案。
LoadScriptsBeforeUI:
當此屬性為 ture 時,為引入的指令碼產生的 <script>元素將出現在所有頁面的 UI 標記之前,否則產生在所有 UI 標記之後。如果在載入的過程執行需要使用了引入的指令碼的指令碼的話,就必須設定其為 true ,否則將無法執行。
4 添加 Web 服務用戶端代理
添加 Web 服務的用戶端代理與添加指令碼類似,如下列代碼所示:
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="MyServices.asmx" />
</Services>
</asp:ScriptManager>
另外,在 Web.config 中還需要加入下列配置項:
<system.web>
<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpHandlers>
</system.web>
這樣,在用戶端指令碼中就可以直接調用 Web 服務的靜態方法了。
5 處理非同步回傳中出現的異常
在此僅介紹最簡單的方式。
通常,在出現異常時,.NET 架構會重新導向到一個黃色的異常頁面上,但對於用非同步回傳的方式處理的頁面來說,這會是一場災難,無法恢複到原頁面的目前狀態。
可以設定 ScriptManager 控制項的 AllowCustomErrorsRedirect = "false" 來阻止出現異常時的重新導向,設定 AsyncPostBackErrorMessage 屬性為出現異常時顯示給使用者的出錯資訊。這樣,當操作出現異常時,ScriptManager 將自動彈出包含 AsyncPostBackErrorMessage 中設定的資訊的瀏覽器訊息框。