惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - zhouyongguo

最省力的多语言解决方案 软件的互联网基因 工作流设计图 手机、未来、饭碗 找到最重要的知识 “智能”的随想 软件也是仿生学 软件交互设计原则 把软件做成艺术品 从人脑到搜索引擎的畅想 权限控制和法官判罪 关于程序员的技能 面对各不相同的业务功能的表单系统架构 项目型企业业务模型简单分析 关于软件的交互性设计 关于正规化 知识管理系统模型浅见 使用Silverlight 实现工作流流程定义 软件的世界(1):认识现实世界 - zhouyongguo - 博客园
采用ASP.NET 2.0的Callback机制构建轻量级的AJAX架构
zhouyongguo · 2007-09-21 · via 博客园 - zhouyongguo

利用Web开发应用程序,主要是因为其易于部署的特点允许站点以较低的成本拥有更多的用户,但是Web用户界面对用户自然和响应灵敏方面却不足。Ajax,可以构建更为动态和响应更灵敏的Web应用程序。

目前我们构建一个AJAX的应用主要有两种方法。

1.     采用成熟的AJAX架构(例如 AJAX.net、微软的Atlas)。

2.     就是自己根据具体的应用自己写。

以下是两种方法的简单比较:

采用成熟的AJAX架构

优点:周期短,简单方便,功能强大

缺点:需要付出一定的学习成本,不够灵活,页面加载代码庞大

自己写具体的应用

优点:灵活,控制力强。前端界面代码简洁

缺点:重用度低,开发周期长。要熟悉AJAX涉及的各部分知识。

微软ASP.NET 2.0对AJAX部分功能进行了封装,提出新的客户端回调功能Callback机制,来实现页面的异步调用和无刷新显示。我们可否对其进一步的封装来实现一个简洁、灵活、不必付出多少学习成本易用的轻量级AJAX架构呢?

下图是我们要构建的轻量级AJAX架构的封装范围。


我们将从以下三个方面进行封装:

1.     服务端对请求的响应,数据的检索

2.     客户端请求数据的构建

3.     客户端数据的检索

  在封装之前我们需要对请求和响应的数据进行抽象定义。

请求和响应的容器(AjaxMsgData

这是一个标准请求和响应数据的承载者,可以包含其他数据类型。例如包含实体,包含集合等等

简单的数据类型

只一个或者单个基本数据类型的值(例如 string,int)

复杂的实体数据类型(AjaxData

一系列具有关系的单个或者复合数据的封装对应业务中的实体对象

实体集合

异常 (AjaxErrData

表示数据操作的结果,失败或者成功,及其信息说明

所有这些数据对象都应该可以xml对象互相转化。每一个数据又分成客户端对象和服务端对象,并且客户端对象和服务端对象接口和名称完全一致

  

1.       使用模板方式对服务端Callback机制进行封装


 

 public abstract class CallbackPage : System.Web.UI.Page, ICallbackEventHandler
    
{
        
string backStr = "";
        
protected void basePage_Load(object sender, EventArgs e)
        
{
           
                ClientScriptManager cm 
= Page.ClientScript;
                String cbRef 
= cm.GetCallbackEventReference(this"arg""ReceiveServerData""context");
                
string strCallback = "function CallServer(arg,context) {" + cbRef + "}";
                cm.RegisterClientScriptBlock(
this.GetType(), "CallServer", strCallback, true);
           
        }


        
override protected void OnInit(EventArgs e)
        
{  
            
this.Load+=new EventHandler(basePage_Load);

            
base.OnInit(e);
        }


        
ICallbackEventHandler 成员
    }

2.       使用连接器方式将客户端和服务端消息连接

 

应用举例:一个简单的用户登录

客户端代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<!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" src="ajax.js"></script>

    <script type="text/javascript">

    function login()

    {   

     var msg=new AjaxMsgData();    

     msg.WorkID="Login";    

     msg.Datas["Name"]=$('TextBox1').value;

     msg.Datas["Pass"]==$('TextBox2').value;   

     var str=msg.toXmlString();

     CallServer(str,'');

     //alert(str);  

    }

function ReceiveServerData(arg, context)

{ 

 // alert(s);

  var msg1=GetMsg(arg);

  alert(msg1.Err.Msg);

}

</script>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        用户名称:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />

        <br />

        密码: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox><br />

        <br />

        <input id="Button1" type="button" value="登录"  onclick="login()" />&nbsp;<br />

        </div>

    </form>

</body>

</html>

服务端代码:

  public partial class _Default : CallbackPage

    {

        public override AjaxMsgData CallBackPress(AjaxMsgData msg)

        {

            if (msg.Datas["Name"].ToString() == "zyg")

                msg.Err.Msg = "用户登录成功";

            return msg;

        }

}

哈! Ajax 的应用是不是变得简单了

源码