1. 程式人生 > 其它 >ASP.NET AJAX(11)__ScriptManagerUpdatePanel的支援成員功能控制成員指令碼控制元件支援成員ScriptMode和ScriptPathLoadScriptsBeforeU

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,則會產生一些錯誤