ASP.NET AJAX(11)__ScriptManagerUpdatePanel的支援成員功能控制成員指令碼控制元件支援成員ScriptMode和ScriptPathLoadScriptsBeforeU
ScriptManager的作用,這個不言而喻,它是整個的ASP.NET AJAX的核心
UpdatePanel的支援成員
- static void RegisterArrayDeclaration
- static void RegisterClientScriptBlock
- static void RegisterScriptInclude
- static void RegisterClientScriptResource
- static void RegisterExpandoAttribute
- static void RegisterHiddenField
- static void RegisterOnSubmitStatement
- static void RegisterStartupScript
- 以上這些方法的功能,我在前面一篇寫專門寫Updatepanel是寫過的,這裡就不在重複啦
- void RegisterDataItem
- void SetFocus//設定焦點
- void RegisterAsyncPostBackControl
- void RegisterPostBackControl
- bool AllowCustomErrorsRedirect{get;set}//默認出現錯誤後跳轉
- string AsyncPostBackErrorMessage{get;set;}//設定非同步回送的錯誤資訊
- int AsyncPostBackTimeout{get;set}
- string AsnycPostBackSourceElementID{get;}//非同步回送由誰發起
- bool IsInAsyncPostBack{get;}//是否在非同步回送過程中
功能控制成員
- static ScriptManager GetCurrent//獲得頁面中的ScriptManager
- bool EnablePageMethods{get;set;}//是否支援aspx頁面方法
- bool EnablePartialRendering{get;set;}//預設為true,是否使用UpdatePanel,如果不使用,強烈建立設定為false
- bool EnableScriptGlobalization{get;set;}//是否支援全球化
- bool EnableScriptLocalization{get;set}//本地化
- is DebuggingEnabled{get;}//執行模式,釋出模式或者調式模式,除錯模式載入的指令碼有格式註釋等,相對要大很多
- bool SupportsPartialRendering{get;set}//是否可以使用UpdatePanel
- AutnecticationServiceManager AuthenticationService {get;}
- ProfileServiceManager ProfileService{get;}
- ScriptReferenceCollection Scripts{get;}
- ServiceReferenctCollection Services{get;}
指令碼控制元件支援成員
- void RegisterDispose
- void RegisterExtenderControl
- void RegisterScriptControl
- void RegisterScriptDescriptors
ScriptMode和ScriptPath
- ScriptMode(釋出模式,除錯模式)設定為Auto,則自動判斷
- ScriptPath__定義一個指令碼載入的基礎路徑,僅對程式集中的指令碼有效
一個關於ScriptMode和ScriptPath的示例
建立一個名為SimpleAjaxService.asmx的WebService,程式碼如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
/// <summary>
///SimpleAjaxService 的摘要說明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
//若要允許使用 ASP.NET AJAX 從指令碼中呼叫此 Web 服務,請取消對下行的註釋。
[System.Web.Script.Services.ScriptService]
public class SimpleAjaxService : System.Web.Services.WebService
{
Random random = new Random(DateTime.Now.Millisecond);
[WebMethod]
public string GetRandomString(int min, int max, string prefix)
{
return prefix + random.Next(min, max);
}
}
在頁面中引入這個WebService,有兩種方法,
一種是在頁面新增ScriptManager,Load事件中新增如下程式碼
ServiceReference serviceRef = new ServiceReference("SimpleAjaxService.asmx");
ScriptManager.GetCurrent(this).Services.Add(serviceRef);
另外一種方式是,在前臺程式碼中新增如下程式碼
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="~/Demo10/SimpleAjaxService.asmx" />
</Services>
</asp:ScriptManager>
在頁面中新增如下程式碼
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ScriptModeAndPath.aspx.cs" Inherits="Demo10_ScriptModeAndPath" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script language="javascript" type="text/javascript">
function getRandomString() {
SimpleAjaxService.GetRandomString(0, 100, "Hello_", onSucceeded);
}
function onSucceeded(result) {
alert(result);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="~/Demo10/SimpleAjaxService.asmx" />
</Services>
</asp:ScriptManager>
<input type="button" value="Get Random String" onclick="getRandomString()" />
</form>
</body>
</html>
這裡不用多解釋,前面有一講“客戶端呼叫WebService”已經講的很多啦
這時,我們在使用HttpWatch觀察它載入的內容的時候,就會發現有很多帶著註釋和格式的js程式碼,因為這時,我們的專案是在debug模式下執行的,
我們做如下修改
在web.config中找到system.web節點下的compilation,設定其<compilation debug="false">,這樣我們的專案就出於一個釋出模式,我們再次重新整理頁面,觀察它引入的指令碼檔案,就是沒有格式和程式碼註釋,並且經過混淆的程式碼,對比引入檔案的大小,回發下在釋出模式下引入的程式碼小了很多很多,
還有一種方式,就是改變頁面中的ScriptManager的ScriptMode,區別就是在web.config中配置,它是全域性的,在頁面中的ScriptManager設定,它是侷限於當前頁面的,ScriptManager預設是Auto,等於web.config中的配置
在ScriptManager中,除了可以引入Service,還可以引入Scripts,方式如下
<asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Release">
<Services>
<asp:ServiceReference Path="~/Demo10/SimpleAjaxService.asmx" />
</Services>
<Scripts>
<asp:ScriptReference Path="~/Demo10/SomeScript.js" />
</Scripts>
</asp:ScriptManager>
除了可以引入js檔案,我們還可以引入程式集中的Resource,方式如下
<asp:ScriptReference Name="Menu.js" Assembly="System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" ScriptMode="Debug" />
這,需要提供它的兩個屬性,資源名和一個完整的命名
SriptManager還可以配置一個ScriptPath,可以配置一個目錄,系統將會把這個路徑當作一個基礎路徑去尋找js檔案
LoadScriptsBeforeUI
- 指令碼載入將會阻塞頁面內容的呈現
- 預設情況下ScriptReferenct會在頁面內容前引入
- 如果把LoadScriptsBeforeUI設定為false,則會把ScriptReference放在頁面末尾載入
- window.onload事件的觸發不受影響
一個示例
建立一個名為TimeConsumingScript.ashx的一般處理程式
using System;
using System.Web;
using System.Threading;
public class TimeConsumingScript : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.Write("// script code here");
Thread.Sleep(2000);
}
public bool IsReusable
{
get
{
return false;
}
}
}
然後建立一個aspx頁面
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="LoadScriptBeforeUI.aspx.cs" Inherits="Demo10_LoadScriptBeforeUI" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script language="javascript" type="text/javascript">
var startLoading = new Date();//頁面開始載入的時間
function pageLoad() {
alert("Page loaded in " + (new Date() - startLoading) + " ms");
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Path="~/Demo10/TimeConsumingScript.ashx" />
</Scripts>
</asp:ScriptManager>
UI Loaded in
<script language="javascript" type="text/javascript">
document.write(new Date() - startLoading);//當前時間減去開始載入的事件
</script>
ms.
</form>
</body>
</html>
我們發現,頁面上顯示了我們載入頁面使用了兩秒多一點的事件,因為我們在那個一般處理程式中,執行緒停止了兩秒鐘
我們對ScriptManager做如下處理
<asp:ScriptManager ID="ScriptManager1" runat="server" LoadScriptsBeforeUI="false">
<Scripts>
<asp:ScriptReference Path="~/Demo10/TimeConsumingScript.ashx" />
</Scripts>
</asp:ScriptManager>
我們把他的LoadScriptBeforeUI設定為false,再重新整理頁面,發現頁面中顯示的載入時間顯示的很少,這時我們開啟頁面原始碼,可以看到,指令碼被載入到了頁面程式碼的尾部,在form結束之前,同時我們看到,windows.onload事件,仍然是在頁面全部載入完以後才被呼叫的
注意:如果我們在設計的時候,使用者會在頁面剛接在的時候,做一些操作,會呼叫我們載入的Script,則如果我們設定了LoadScriptBeforeUI設定為false,則會產生一些錯誤