• 新瓶旧酒ASP.NET AJAX(6) 客户端脚本编程(Sys.WebForms命名空间下的类Sys.Serialization命名空间下的类)


    [索引页]
    [源码下载]


    新瓶旧酒ASP.NET AJAX(6) - 客户端脚本编程(Sys.WebForms命名空间下的类Sys.Serialization命名空间下的类)


    作者:webabcd


    介绍
    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
        ·postBackElement属性 - 产生回发事件的元素

    4、EndRequestEventArgs Class
        ·error属性 - Error对象
        ·errorHandled属性 - 异常是否已经被处理
        ·response属性 - Sys.Net.WebRequestExecutor对象
        ·dataItems属性 - 服务端注册的DataItem

    5、PageLoadingEventArgs Class
        ·panelsUpdating属性 - 准备更新的UpdatePanel数组(div元素)
        ·dataItems属性 - 服务端注册的DataItem

    6、PageRequestManager Class
        ·panelsUpdated属性 - 更新完毕的UpdatePanel数组(div元素)
        ·dataItems属性 - 服务端注册的DataItem

    7、Sys.Serialization.JavaScriptSerializer Class
        ·serialize方法 - 序列化(参数:ECMAScript(JavaScript)对象;返回值:JSON字符串)
        ·deserialize方法 - 反序列化(参数:JSON字符串;返回值ECMAScript(JavaScript)对象:)

    8、其它请查看官方文档


    示例
    InitializeRequest.aspx
    <%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="InitializeRequest.aspx.cs"
        Inherits
    ="ClientScripting_SysWebForms_InitializeRequest" Title="InitializeRequest" 
    %>

    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">

        
    <script runat="Server">
            protected 
    void Button1_Click(object sender, EventArgs e)
            
    {
                System.Threading.Thread.Sleep(
    3000);
            }

        
    </script>

        
    <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="0" DynamicLayout="false">
            
    <ProgressTemplate>
                Loading
            
    </ProgressTemplate>
        
    </asp:UpdateProgress>
        
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            
    <ContentTemplate>
                
    <%= DateTime.Now %>
                
    <br />
                
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
                
    &nbsp;&nbsp;
                
    <asp:Button ID="Button2" runat="server" Text="cancel属性测试" OnClick="Button1_Click" />
            
    </ContentTemplate>
        
    </asp:UpdatePanel>
        
    <p>
            
    <textarea id="TraceConsole" style=" 500px; height: 300px;"></textarea>
        
    </p>

        
    <script type="text/javascript" language="javascript">
        
            Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(initializeRequestHandler);
            
            
    function initializeRequestHandler(sender, e)
            
    {
                
    // postBackElement - 产生回发事件的元素
                if (e.get_postBackElement().id == "<%= Button2.ClientID %>")
                
    {
                    
    // 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());
                }

            }

        
    </script>

    </asp:Content>

    运行结果
    1、单击“Button”按钮
    ctl00_ContentPlaceHolder1_Button1
    false

    2、在Loading的过程中再次单击“Button”按钮
    ctl00_ContentPlaceHolder1_Button1
    true

    3、单击“cancel属性测试”按钮
    没有反应


    BeginRequestAndEndRequest.aspx
    注:在ScriptManager的OnAsyncPostBackError事件中输入代码:ScriptManager1.AsyncPostBackErrorMessage = e.Exception.Message + "(母版页的ScriptManager格式化错误信息)";
    <%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="BeginRequestAndEndRequest.aspx.cs"
        Inherits
    ="ClientScripting_SysWebForms_BeginRequestAndEndRequest" Title="BeginRequest和EndRequest" 
    %>

    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">

        
    <script runat="Server">
            protected 
    void Button1_Click(object sender, EventArgs e)
            
    {
                
    int i = Int32.Parse("abc");
            }


            protected 
    void Button2_Click(object sender, EventArgs e)
            
    {
                ScriptManager.GetCurrent(
    this).RegisterDataItem(this.UpdatePanel1, "webabcd");
            }

        
    </script>

        
    <asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="Server">
            
    <ContentTemplate>
                
    <%= DateTime.Now.ToString() %>
                
    <br />
                
    <asp:Button ID="Button1" runat="server" Text="触发异常" OnClick="Button1_Click" />
                
    &nbsp;&nbsp;
                
    <asp:Button ID="Button2" runat="server" Text="RegisterDataItem测试" OnClick="Button2_Click" />
            
    </ContentTemplate>
        
    </asp:UpdatePanel>

        
    <p>
            
    <textarea id="TraceConsole" style=" 500px; height: 100px;"></textarea>
        
    </p>

        
    <script language="javascript" type="text/javascript">

            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)
            
    {
                
    // postBackElement - 产生回发事件的元素
                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 = "<%= this.UpdatePanel1.ClientID %>";
                
                
    // dataItems - 服务端注册的DataItem
                if (typeof(e.get_dataItems()[upId]) != 'undefined')
                
    {
                    Sys.Debug.trace(
    "注册的数据项为:" + e.get_dataItems()[upId]);
                }

            }


        
    </script>

    </asp:Content>

    运行结果
    1、单击“触发异常”按钮
    弹出框,信息:ct100_ContentPlaceHolder1_Button1
    状态代码:200
    出错了!错误信息:输入字符串的格式不正确。(母版页的ScriptManager格式化错误信息)

    2、单击“RegisterDataItem测试”按钮
    弹出框,信息:ct100_ContentPlaceHolder1_Button2
    状态代码:200
    注册的数据项为:webabcd


    Sample.aspx
    <%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Sample.aspx.cs"
        Inherits
    ="ClientScripting_SysSerialization_Sample" Title="Sys.Serialization Sample" 
    %>

    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">

        
    <script runat="Server">
            protected 
    void Button1_Click(object sender, EventArgs e)
            
    {
                
    // 创建一个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);
            }


            
    /// <summary>
            /// Person类
            /// </summary>
            public class Person
            
    {
                private string _name;
                
    /// <summary>
                /// 姓名
                /// </summary>
                public string Name
                
    {
                    get 
    return _name; }
                    set 
    { _name = value; }
                }


                private 
    int _age;
                
    /// <summary>
                /// 年龄
                /// </summary>
                public int Age
                
    {
                    get 
    return _age; }
                    set 
    { _age = value; }
                }


            }

        
    </script>

        
    <asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="Server">
            
    <ContentTemplate>
                
    <%= DateTime.Now.ToString()%>
                
    <br />
                
    <asp:Button ID="Button1" runat="server" Text="Sys.Serialization" OnClick="Button1_Click" />
            
    </ContentTemplate>
        
    </asp:UpdatePanel>
        
    <p>
            
    <textarea id="TraceConsole" style=" 500px; height: 100px;"></textarea>
        
    </p>

        
    <script language="javascript" type="text/javascript">

            Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
            
            
    function endRequestHandler(sender, e)
            
    {
                
    var upId = "<%= this.UpdatePanel1.ClientID %>";
                
                
    // 获得服务端注册的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));
            }


        
    </script>

    </asp:Content>

    运行结果
    单击“Sys.Serialization”按钮
    {"Name":"webabcd","Age":27}
    webabcd 27
    {"Name":"webabcd","Age":27}


    OK
    [源码下载]
  • 相关阅读:
    UVA
    [CQOI2018] 社交网络
    UVA
    51nod 1314 定位系统
    51nod 1211 数独
    51nod 1392 装盒子
    51nod1253 Kundu and Tree
    51nod1313 完美串
    51nod1039 x^3 mod p
    51nod1369 无穷印章
  • 原文地址:https://www.cnblogs.com/webabcd/p/788430.html
Copyright © 2020-2023  润新知