在期望不执行回发(postback)而从客户端运行服务器代码的情况下,可以使用ClientScriptManager类来调用客户端回调(callback)。这称为对服务器执行带外回调。在客户端回调中,客户端脚本函数项ASP.NET网页发送异步请求。网页修改其正常生命周期来处理回调。

 
        回调的过程如下:
        (1)客户端发出请求,请求内容包括:指定更新控件和传递参数。
        (2)服务端响应、处理。
        (3)服务器将处理后的内容以字符串返回。
        (4)客户端指定一个函数接受返回值。
        (5)客户端更新指定控件。
 
        使用回调的步骤如下:
 
        (1)在控件或page类中实现ICallbackEventHandler接口。该接口有两个方法,分别是RaiseCallbackEvent和GetCallbackResult。RaiseCallbackEvent方法是回调执行的方法,该方法处理回调的内容。它没有返回值,而是从浏览器接受一个字符串作为事件的参数,即该方法接受客户端JavaScript所传递的参数。注意它是首先触发的。接下来触发的就是GetCallbackResult方法,它将所得到的结果传回给客户端的脚本。
        (2)生成调用该回调的客户端脚本。可以通过ClientScriptManager类的GetCallbackEventReference方法来生成。
        (3)编写代码调用(2)中生成的客户端脚本。
 
        以下通过一个例子来说明回调过程。。。
 
        新建一ASP.NET 应用程序,设置Default窗体界面如下:
 
 
        1,在Defalut.aspx.cs类实现ICallbackEventHandler接口,代码如下
 
public partial class _Default : System.Web.UI.Page,ICallbackEventHandler
    {
        string callbackResult;         #region ICallbackEventHandler 成员         //这是RaiseCallbackEvent方法触发之后触发的,它将得到的结果返回给客户端的脚本《《《《《《《《222222
        //客户端脚本的onCallbackComplete(result,context)方法里面的result在这里其实就是指callbackResult
        public string GetCallbackResult()
        {
            return callbackResult;
        }         //回调执行的方法,首先触发的,里面的一个参数接受从客户端传来的值《《《《《《1111111
        public void RaiseCallbackEvent(string eventArgument)
        {
            try
            {
                callbackResult = WebService.getResult(eventArgument);//由于这里调用的是webservice的getResult的方法,所以也可以把getResult方法放在这里。
            }
            catch (Exception e)
            {
                Trace.Write(e.Message);
                throw new Exception("调用失败");
            }
        }         #endregion
    } 
 
        2,生成调用该回调的客户端脚本。在Default类的page_Load事件中加入如下代码:
 
public partial class _Default : System.Web.UI.Page,ICallbackEventHandler
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsCallback)
            {
                return;
            }             //根据传入的参数返回实际的回调脚本《《《《《《《《33333333             //target处理客户端回调的服务器 Control 的名称。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。
            //argument从客户端脚本传递给服务器端的一个参数
            //clientCallback一个客户端事件处理程序的名称,该处理程序接收成功的服务器端事件的结果。
            //context启动回调之前在客户端计算的客户端脚本。脚本的结果传回客户端事件处理程序。
            //clientErrorCallback客户端事件处理程序的名称,该处理程序在服务器端事件处理程序出现错误时接收结果。
            //useAsynctrue 表示同步执行回调;false 表示异步执行回调。
            string callBackFunctionCall = ClientScript.GetCallbackEventReference(this, "getTextValue()", "onCallbackComplete", null, "onCallbackError", true);
           
            //注册客户端脚本《《《《《《《《444444
            string csname = "CallBack";//要注册的客户端脚本的键。
            if (!ClientScript.IsClientScriptBlockRegistered(GetType(), csname))
            {
                //type要注册的客户端脚本的类型。
                //key要注册的客户端脚本的键。
                //script要注册的客户端脚本文本。
                //addScriptTags指示是否添加脚本标记的布尔值。
                ClientScript.RegisterClientScriptBlock(GetType(), csname, "function DoClientCallBack(){" + callBackFunctionCall + "}", true);
            }
        }
    }
 
        3,编写客户端代码,在Default.aspx文件中添加如下JavaScript脚本:
 
<script type ="text/javascript" >
    function getTextValue()//要传递给服务器的参数
    {
        var arg1=document.getElementById ("Text1").value;
        var arg2=document.getElementById ("Text2").value;
        var arg="argA="+arg1+"&argB="+arg2;//注意这里的传递方式
        return arg;
    }
   
    function onCallbackComplete(result,context)//回调成功
    {
//        alert(result);
        document.getElementById ("TextArea1").value=result;
    }
   
    function onCallbackError()//回调失败
    {
        alert("回调失败!");
    }
    </script>
 
 
        最后补充在(1)中的RaiseCallbackEvent方法中调用的类webservice的getResult方法,在项目中添加一名为WebService.asmx的web服务页面。在WebService.asmx.cs文件中定义一个名为getResult的方法,这段代码其实也可以直接放置在RaiseCallbackEvent方法中,但是为了实现调用webservice的效果还是把它单独放置到一个webservice文件中,具体代码如下:
 
public class WebService : System.Web.Services.WebService
    {         [WebMethod]
        public static string getResult(string name)//静待函数
        {
            string[] keyValuePairs;//含有”=“的数组
            string[] keyValue;//只有字符串的数组
            NameValueCollection m_queryString= new NameValueCollection();//键值对的集合              keyValuePairs = name.Split("&".ToCharArray ());
             if (keyValuePairs.Length > 0)//如果传递的参数是argA=arg1&argB=arg2……形式的,也就是说参数不止一个
             {
                 for (int i = 0; i < keyValuePairs.Length; i++)
                 {
                     keyValue = keyValuePairs.GetValue(i).ToString().Split("=".ToCharArray());
                      m_queryString.Add(keyValue[0], keyValue[1]);
                 }
             }
             else//传递的参数只有一个
             {
                 keyValue = name.Split("=".ToCharArray());
                 if (keyValue.Length > 0)//如果有参数传递过来的话
                 {
                      m_queryString.Add(keyValue[0], keyValue[1]);
                 }
             }
             //通过htQueryString["argA"]这种方式调用参数的值
             return "第一个参数是: " + m_queryString["argA"].ToString() + "\n第二个参数是: " + m_queryString["argB"].ToString();
        }
    }
 
 
执行结果如下:
 
 
该页面的用户交互与上一篇博客Ajax打开三种页面的请求的页面是一样的,但是代码大大减少了,因为我们不需要编写代码来解析XML或处理XMLHttpRequest对象。

.NET内置的Ajax工作原理的更多相关文章

  1. AJAX工作原理与缺点

    1.概念:什么是AJAXAJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术.2.为什么要使用他 ...

  2. 目录结构-内置(AJAX)帮助文档

    Discuz common.js 内置(AJAX)函数帮助文档 作者:cr180 / 整理日期:1970-01-01 / 个人站点:www.cr180.com / Discuz超级管家 showMen ...

  3. ajax工作原理及jsonp跨域详解

    一.Ajax简介 ajax = 异步 JavaScript 和 XML. ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术.我们知道,传统的网页(不使用ajax)如果需要更新内容, ...

  4. Ajax工作原理和原生JS的ajax封装

    前言: 之所以用ajax作为博客的开篇,是因为无论从ajax的出现还是从它的作用上来说,ajax对于前端无疑是意义重大的.甚至可以说,是ajax带来了前端这个行业.当然,历史并不能说明当下,曾经的辉煌 ...

  5. 简要总结ajax工作原理及优缺点

    虽然在实际的项目中使用多种ajax请求,但就其工作原理,优缺点尚未深入总结, 参考:http://www.cnblogs.com/SanMaoSpace/archive/2013/06/15/3137 ...

  6. 【java项目实践】具体解释Ajax工作原理以及实现异步验证username是否存在+源代码下载(java版)

    一年前,从不知道Ajax是什么,伴随着不断的积累,到如今常常使用,逐渐有了深入的认识. 今天,假设想开发一个更加人性化,友好,无刷新,交互性更强的网页,那您的目标一定是Ajax. 介绍 在具体讨论Aj ...

  7. thinkphp中ajax使用实例(thinkphp内置支持ajax)

    thinkphp中ajax使用实例(thinkphp内置支持ajax) 一.总结 1.thinkphp应该是内置支持ajax的,所以请求类型里面才会有是否是ajax // 是否为 Ajax 请求 if ...

  8. ajax工作原理,Jsonp原理

    Ajax工作原理是 相当于在用户和服务器之间加了-个中间层(AJAX引擎),使用户操作与服务器响应异步化. 对于用户请求ajax引擎会做一些数据验证和数据处理,不是所有请求都提交给服务器,当需要从服务 ...

  9. ajax工作原理/实例

    ajax是什么? 是一种创建交互式网页应用的一种网页技术.简单来说,就是向服务器发起请求,获得数据使交互性和用户体验更好. ajax不是一种新的技术,是一些技术的集合体.有 1.XHTML和CSS 2 ...

随机推荐

  1. POJ 2363 Blocks (ZOJ 1910) 数学

    杨宗纬的歌"这一路走来" 还蛮好听的,这首歌静静的躺在我的音乐盒某个阴暗的角落里,今天随机播放才发现的,哈哈. 数学一直是硬伤...... -------------------- ...

  2. python链表的实现,有注释

    class Node():                   #node实现,每个node分为两部分:一部分含有链表元素,成数据域;另一部分为指针,指向下一个  __slots__=['_item' ...

  3. signature.html

    原文网址:http://www.youdzone.com/signature.html   阮一峰:http://www.ruanyifeng.com/blog/2011/08/what_is_a_d ...

  4. 【15.07%】【codeforces 625A】Guest From the Past

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  5. 号外:小雷将开发一款Java版的简易CMS系统

    我的个人官网: http://FansUnion.cn 已经改版,隆重上线了,欢迎关注~持续升级中...     出于个人兴趣.技术总结.工作相关,我终于想要做一个简单的CMS系统了. 原来想研究,D ...

  6. 【27.77%】【BZOJ 4066】简单题

    Time Limit: 50 Sec  Memory Limit: 20 MB Submit: 1919  Solved: 533 [Submit][Status][Discuss] Descript ...

  7. Android 动态改变高度以及计算长度的EditText

    前段时间项目需求,需要做一个有限制长度的输入框并动态显示剩余文字,同时也要动态改变EditText的高度来增加用户体验.现整理出来与大家分享. 先来看看效果图 看了效果就分享一下布局 <Rela ...

  8. js进阶 11-2 jquery属性如何操作

    js进阶 11-2  jquery属性如何操作 一.总结 一句话总结:jquery中的属性用attr方法表示.jquery中都是方法. 1.jquery中的属性的增删改查操作? 只需要两个方法, at ...

  9. JS表格分页组件:fupage的设计思路和具体用法(未来考虑开源,争取在2015年)

    一.背景         之前在秒针工作的时候,某js高级工程师写了很多自己的组件,其中一套是分页组件,叫做st-grid.不过在我看来,bug太多,我经常给他反馈bug,我也不清楚为啥别人没有发现. ...

  10. 2015年创业中遇到的技术问题:1-10(乱码-SpringMVC-jquery-JSON等)

    1.数据库表名重构.    之前受PHP等程序的影响,数据库表名喜欢用数据库的名称作为前缀,比如"p2p_account".    在经过大量的实践之后,发现Java程序中,基本没 ...