天天看点

新瓶旧酒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,如需转载请自行联系原作者

继续阅读