在期望不执行回发(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. linux下实现监控进程网络带宽

    嗯,近期都在网易游戏实习,所以貌似有段时间没有上来写点东西了... 来网易游戏实习最基本的目的事实上就是想知道在游戏公司里面工作都是些什么内容,毕竟自己曾经也没有接触过游戏公司.. 还比較的好奇.. ...

  2. js 99乘法表

    哈哈哈,笑死我了,突然怀念学习时代,撸了一个乘法表 for(let a=1;a<10;a++){let str = ''; for(let b=1;b<10;b++){ str = str ...

  3. bc-win32-power-echo-vim-not-work

    http://gnuwin32.sourceforge.net/packages.html linux ok, but win32 not ok [root@130-255-8-100 ~]# ech ...

  4. 【solr专题之二】配置文件:solr.xml solrConfig.xml schema.xml 分类: H4_SOLR/LUCENCE 2014-07-23 21:30 1959人阅读 评论(0) 收藏

    1.关于默认搜索域 If you are using the Lucene query parser, queries that don't specify a field name will use ...

  5. printk()函数的总结

    我们在使用printk()函数中使用日志级别为的是使编程人员在编程过程中自定义地进行信息的输出,更加容易地掌握系统当前的状况.对程序的调试起到了很重要的作用.(下文中的日志级别和控制台日志控制级别是一 ...

  6. 驱动程序调试方法之printk——自制proc文件(一)

    首先我们需要弄清楚proc机制,来看看fs/proc/proc_misc.c这个文件,从入口函数开始看: proc_misc_init(void)         #ifdef CONFIG_PRIN ...

  7. event.relatedTarget、event.fromElement、event.toElement

    在标准DOM中,mouseover和mouseout所发生的元素可以通过event.target来访问,相关元素通过event.relatedTarget属性来访问.event.relatedTarg ...

  8. 【codeforces 742A】Arpa’s hard exam and Mehrdad’s naive cheat

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  9. CEPH OBJECTSTORE API介绍

    Thomas是本人在Ceph中国社区翻译小组所用的笔名,该文首次公布在Ceph中国社区.现转载到本人博客,以供大家传阅 CEPH OBJECTSTORE API介绍 本文由 Ceph中国社区-Thom ...

  10. 从多路搜索树到 B-树

    1. 什么是 B 树 B 树是为磁盘或其他直接存取的辅助存储设备而设计的一种平衡二叉树: B 树类似于红黑树,但它们在降低磁盘 I/O 操作数方面要更好一点, 许多数据库系统使用 B 树或者 B 树的 ...