天天看點

新瓶舊酒ASP.NET AJAX(6) - 用戶端腳本程式設計

<a href="http://webabcd.blog.51cto.com/1787395/344663" target="_blank">[索引頁]</a>

<a href="http://down.51cto.com/data/100916" target="_blank">[源碼下載下傳]</a>

新瓶舊酒ASP.NET AJAX(6) - 用戶端腳本程式設計(Sys.WebForms命名空間下的類Sys.Serialization命名空間下的類)

介紹

Sys.WebForms命名空間下的類都是與局部重新整理相關的類。PageRequestManager類,其中有5個事件:initializeRequest事件、beginRequest事件、endRequest事件、pageLoading事件和pageLoaded事件。與這5個事件相關的還有5個事件參數類:InitializeRequestEventArgs類、BeginRequestEventArgs類、EndRequestEventArgs類、PageLoadingEventArgs類和PageLoadedEventArgs類。Sys.Serialization命名空間下隻有一個類:Sys.Serialization.JavaScriptSerializer類。它用于在ECMAScript(JavaScript)對象與JSON格式資料之間進行轉換。

1、PageRequestManager Class

    ·initializeRequest Event - 異步回發的初始化時觸發

    ·beginRequest Event - 異步回發開始前觸發

    ·endRequest Event - 異步回發完成後觸發

    ·pageLoading Event - 異步回發完成後頁面加載開始前觸發

    ·pageLoaded Event - 異步回發完成後頁面加載完成後觸發

    ·Sys.WebForms.PageRequestManager.getInstance(); - 傳回頁面的PageRequestManager類的執行個體

    ·Sys.WebForms.PageRequestManager.getInstance().abortPostBack(); - 終止所有異步回發

    ·isInAsyncPostBack屬性 - 是否正在異步回發過程中

2、InitializeRequestEventArgs Class

    ·postBackElement屬性 - 産生回發事件的元素

    ·InitializeRequestEventArgs繼承自Sys.CancelEventArgs,是以具有cancel屬性 - 是否取消回發

3、BeginRequestEventArgs Class

4、EndRequestEventArgs Class

    ·error屬性 - Error對象

    ·errorHandled屬性 - 異常是否已經被處理

    ·response屬性 - Sys.Net.WebRequestExecutor對象

    ·dataItems屬性 - 服務端注冊的DataItem

5、PageLoadingEventArgs Class

    ·panelsUpdating屬性 - 準備更新的UpdatePanel數組(div元素)

6、PageRequestManager Class

    ·panelsUpdated屬性 - 更新完畢的UpdatePanel數組(div元素)

7、Sys.Serialization.JavaScriptSerializer Class

    ·serialize方法 - 序列化(參數:ECMAScript(JavaScript)對象;傳回值:JSON字元串)

    ·deserialize方法 - 反序列化(參數:JSON字元串;傳回值ECMAScript(JavaScript)對象:)

示例

InitializeRequest.aspx

&lt;%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="InitializeRequest.aspx.cs" 

        Inherits="ClientScripting_SysWebForms_InitializeRequest" Title="InitializeRequest" %&gt; 

&lt;asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"&gt; 

        &lt;script runat="Server"&gt; 

                protected void Button1_Click(object sender, EventArgs e) 

                { 

                        System.Threading.Thread.Sleep(3000); 

                } 

        &lt;/script&gt; 

        &lt;asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="0" DynamicLayout="false"&gt; 

                &lt;ProgressTemplate&gt; 

                        Loading 

                &lt;/ProgressTemplate&gt; 

        &lt;/asp:UpdateProgress&gt; 

        &lt;asp:UpdatePanel ID="UpdatePanel1" runat="server"&gt; 

                &lt;ContentTemplate&gt; 

                        &lt;%= DateTime.Now %&gt; 

                        &lt;br /&gt; 

                        &lt;asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /&gt; 

                        &lt;asp:Button ID="Button2" runat="server" Text="cancel屬性測試" OnClick="Button1_Click" /&gt; 

                &lt;/ContentTemplate&gt; 

        &lt;/asp:UpdatePanel&gt; 

        &lt;p&gt; 

                &lt;textarea id="TraceConsole" style="width: 500px; height: 300px;"&gt;&lt;/textarea&gt; 

        &lt;/p&gt; 

        &lt;script type="text/javascript" language="javascript"&gt; 

                Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(initializeRequestHandler); 

                function initializeRequestHandler(sender, e) 

                        // postBackElement - 産生回發事件的元素 

                        if (e.get_postBackElement().id == "&lt;%= Button2.ClientID %&gt;") 

                        { 

                                // InitializeRequestEventArgs繼承自Sys.CancelEventArgs    

                                // 取消回發 

                                e.set_cancel(true); 

                        } 

                        else 

                                // 獲得頁面的PageRequestManager類的執行個體 

                                var prm = Sys.WebForms.PageRequestManager.getInstance(); 

                                Sys.Debug.trace(e.get_postBackElement().id); 

                                // Sys.WebForms.PageRequestManager的isInAsyncPostBack屬性 - 是否正在異步回發過程中 

                                Sys.Debug.trace(prm.get_isInAsyncPostBack()); 

&lt;/asp:Content&gt;

運作結果

1、單擊“Button”按鈕

ctl00_ContentPlaceHolder1_Button1

false

2、在Loading的過程中再次單擊“Button”按鈕

true

3、單擊“cancel屬性測試”按鈕

沒有反應

BeginRequestAndEndRequest.aspx

注:在ScriptManager的OnAsyncPostBackError事件中輸入代碼:ScriptManager1.AsyncPostBackErrorMessage = e.Exception.Message + "(母版頁的ScriptManager格式化錯誤資訊)";

&lt;%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="BeginRequestAndEndRequest.aspx.cs" 

        Inherits="ClientScripting_SysWebForms_BeginRequestAndEndRequest" Title="BeginRequest和EndRequest" %&gt; 

                        int i = Int32.Parse("abc"); 

                protected void Button2_Click(object sender, EventArgs e) 

                        ScriptManager.GetCurrent(this).RegisterDataItem(this.UpdatePanel1, "webabcd"); 

        &lt;asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="Server"&gt; 

                        &lt;%= DateTime.Now.ToString() %&gt; 

                        &lt;asp:Button ID="Button1" runat="server" Text="觸發異常" OnClick="Button1_Click" /&gt; 

                        &lt;asp:Button ID="Button2" runat="server" Text="RegisterDataItem測試" OnClick="Button2_Click" /&gt; 

                &lt;textarea id="TraceConsole" style="width: 500px; height: 100px;"&gt;&lt;/textarea&gt; 

        &lt;script language="javascript" type="text/javascript"&gt; 

                Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequestHandler); 

                Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler); 

                Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler2); 

                function beginRequestHandler(sender, e) 

                        alert(e.get_postBackElement().id);                         

                function endRequestHandler(sender, e) 

                        // response - Sys.Net.WebRequestExecutor對象 

                        Sys.Debug.trace("狀态代碼:" + e.get_response().get_statusCode()); 

                        if (e.get_error()) 

                                // errorHandled - 異常是否已經被處理 

                                e.set_errorHandled(true); 

                                // error - Error對象 

                                Sys.Debug.trace("出錯了!錯誤資訊:" + e.get_error().message); 

                function endRequestHandler2(sender, e) 

                        var upId = "&lt;%= this.UpdatePanel1.ClientID %&gt;"; 

                        // dataItems - 服務端注冊的DataItem 

                        if (typeof(e.get_dataItems()[upId]) != 'undefined') 

                                Sys.Debug.trace("注冊的資料項為:" + e.get_dataItems()[upId]); 

1、單擊“觸發異常”按鈕

彈出框,資訊:ct100_ContentPlaceHolder1_Button1

狀态代碼:200

出錯了!錯誤資訊:輸入字元串的格式不正确。(母版頁的ScriptManager格式化錯誤資訊)

2、單擊“RegisterDataItem測試”按鈕

彈出框,資訊:ct100_ContentPlaceHolder1_Button2

注冊的資料項為:webabcd

Sample.aspx

&lt;%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Sample.aspx.cs" 

        Inherits="ClientScripting_SysSerialization_Sample" Title="Sys.Serialization Sample" %&gt; 

                        // 建立一個Person對象 

                        Person person = new Person(); 

                        person.Name = "webabcd"; 

                        person.Age = 27; 

                        // 序列化上面建立的Person對象,使其成為一個JSON字元串 

                        System.Web.Script.Serialization.JavaScriptSerializer jss = new System.Web.Script.Serialization.JavaScriptSerializer(); 

                        string s = jss.Serialize(person); 

                        // 注冊DataItem 

                        ScriptManager.GetCurrent(this).RegisterDataItem(this.UpdatePanel1, s); 

                /// &lt;summary&gt; 

                /// Person類 

                /// &lt;/summary&gt; 

                public class Person 

                        private string _name; 

                        /// &lt;summary&gt; 

                        /// 姓名 

                        /// &lt;/summary&gt; 

                        public string Name 

                                get { return _name; } 

                                set { _name = value; } 

                        private int _age; 

                        /// 年齡 

                        public int Age 

                                get { return _age; } 

                                set { _age = value; } 

                        &lt;%= DateTime.Now.ToString()%&gt; 

                        &lt;asp:Button ID="Button1" runat="server" Text="Sys.Serialization" OnClick="Button1_Click" /&gt; 

                        // 獲得服務端注冊的DataItem,它是一個JSON字元串 

                        var jsonStringServer = e.get_dataItems()[upId]; 

                        // 反序列化這個JSON字元串,使其成為一個JSON對象 

                        var jsonObject = Sys.Serialization.JavaScriptSerializer.deserialize(jsonStringServer) 

                        // 序列化這個JOSN對象,使其成為一個JSON字元串 

                        var jsonStringClient = Sys.Serialization.JavaScriptSerializer.serialize(jsonObject); 

                        Sys.Debug.trace(jsonStringClient); 

                        Sys.Debug.trace(jsonObject.Name + " " + jsonObject.Age); 

                        Sys.Debug.trace(Sys.Serialization.JavaScriptSerializer.serialize(jsonObject)); 

單擊“Sys.Serialization”按鈕

{"Name":"webabcd","Age":27}

webabcd 27

OK

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/344801,如需轉載請自行聯系原作者

繼續閱讀