新瓶旧酒ASP.NET AJAX(6) - 客户端脚本编程

简介:
[索引页]
[源码下载]


新瓶旧酒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" /> 
                           
                        <asp:Button ID="Button2" runat="server" Text="cancel属性测试" OnClick="Button1_Click" /> 
                </ContentTemplate> 
        </asp:UpdatePanel> 
        <p> 
                <textarea id="TraceConsole" style="width: 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" /> 
                           
                        <asp:Button ID="Button2" runat="server" Text="RegisterDataItem测试" OnClick="Button2_Click" /> 
                </ContentTemplate> 
        </asp:UpdatePanel> 

        <p> 
                <textarea id="TraceConsole" style="width: 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="width: 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
[源码下载]
 

     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/344801 ,如需转载请自行联系原作者
目录
打赏
0
0
0
0
348
分享
相关文章
|
7月前
|
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
306 10
基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux
基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux
239 0
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
98 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
153 8
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
152 4
分享5款.NET开源免费的Redis客户端组件库
分享5款.NET开源免费的Redis客户端组件库
151 1
|
11月前
|
Golang深入浅出之-HTTP客户端编程:使用net/http包发起请求
【4月更文挑战第25天】Go语言`net/http`包提供HTTP客户端和服务器功能,简化高性能网络应用开发。本文探讨如何发起HTTP请求,常见问题及解决策略。示例展示GET和POST请求的实现。注意响应体关闭、错误处理、内容类型设置、超时管理和并发控制。最佳实践包括重用`http.Client`,使用`context.Context`,处理JSON以及记录错误日志。通过实践这些技巧,提升HTTP编程技能。
129 1
|
11月前
|
Golang深入浅出之-HTTP客户端编程:使用net/http包发起请求
【4月更文挑战第24天】Go语言的`net/http`包在HTTP客户端编程中扮演重要角色,但使用时需注意几个常见问题:1) 检查HTTP状态码以确保请求成功;2) 记得关闭响应体以防止资源泄漏;3) 设置超时限制,避免长时间等待;4) 根据需求处理重定向。理解这些细节能提升HTTP客户端编程的效率和质量。
126 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等