本文希望为有一定基础的Asp.net Ajax同学提供另外一个视角,进一步的分析了解Asp.net Ajax的运行机制。

首先,源代码从何而来?

我是用的笨方法(如果大家有好办法,一定给我留言哟!):
在vs2008中,
1. 建一个普通的aspx页面,F5,然后ViewSource,查看源代码;
2. 在页面引入ScriptManager,F5,再查看源代码;并保存该页面。
3. 将两份源代码进行比较。
通过比较,我们发现,引入了ScriptManager的页面源代码,多出了以下代码:

__doPostBack函数
asp.net页面机制的核心函数,但与本系列主题关系不大,且网上资料极多,本系列暂时略过

一些好像js文件引用语法的代码:

代码

<script src="/WebSite1/WebResource.axd?d=gu6dukLklJSIqP50ryiLdA2&amp;t=633924497349218750" type="text/javascript"></script>
<script src="/WebSite1/ScriptResource.axd?d=DtElDd7tk8ezOcfu5ceM7a0aJRKvNJXhtJklJTwP_eJvqJ6_MEFJff0KgiIxspCLhj3QOdNhPGEeJspoRkqzWGYl4vK7CM_KcaFGG0E_EuY1&amp;t=763bd652" type="text/javascript"></script>
<script src="/WebSite1/ScriptResource.axd?d=DtElDd7tk8ezOcfu5ceM7a0aJRKvNJXhtJklJTwP_eJvqJ6_MEFJff0KgiIxspCLTdp4O_K8y1MspVEeDbwrWtWBunZBt5t5QheDMWS7niiJtyuaRzTdlKxODRDyBKUC0&amp;t=763bd652" type="text/javascript"></script>

咦?这种代码是什么意思?引用的*.axd文件,而且还有d=*,t=*的参数。

一些似乎是初始化(initialize)的代码:

代码

Sys.WebForms.PageRequestManager._initialize('ScriptManager1', document.getElementById('form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls([], [], [], 90);
Sys.Application.initialize();

无论如何,先找到ScriptResource.axd文件吧。前面说过,我们查看aspx页面源代码的同时,还保存了aspx页面,因此在保存html文件的同时,还会生产一个文件夹;就在这个文件夹下,我们清清楚楚的发现,3个*.axd文件。试试看,居然能用记事本打开!里面就是不折不扣的js代码呀。

对于ScriptResource.axd,我简单的解释一下(其实我的理解也不深,呵呵):
1. 和.aspx一样,axd也是一个后缀名(基本上等于废话)
2. asp.net通过检查文件的后缀名,对文件采取不同的处理(HttpHandler)
3. 这种配置可以在web.config里找到

代码

<httpHandlers>
        <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
</httpHandlers>

上面这句话的意思就是,对ScriptResource.axd这种“路径”,调用System.Web.Handlers.ScriptResourceHandler类进行处理。有兴趣的同学可以用reflactor看一看这个类,这里不展开了。
而ScriptResource.axd后面带的参数:d是指经过编码的资源键,t是一个时间戳,指示这个程序集最后一次修改时间。再次加载这个页面时,页面根据以上两个参数判断资源是否修改过,来决定重新加载或调用浏览器缓存。

WebResource.axd是类似的,但是asp.net2.0的机制,此处也只能暂时略过了。

OK!就此开始我们的探索之旅吧。

我们首先打开ScriptResource.axd文件。

今天我们先看这两段代码:

代码

Function.createCallback = function Function$createCallback(method, context) {
    /// <summary locid="M:J#Function.createCallback" />
    /// <param name="method" type="Function"></param>
    /// <param name="context" mayBeNull="true"></param>
    /// <returns type="Function"></returns>
    var e = Function._validateParams(arguments, [
        {name: "method", type: Function},
        {name: "context", mayBeNull: true}
    ]);
    if (e) throw e;
    return function() {
        var l = arguments.length;
        if (l > 0) {
            var args = [];
            for (var i = 0; i < l; i++) {
                args[i] = arguments[i];
            }
            args[l] = context;
            return method.apply(this, args);
        }
        return method.call(this, context);
    }
}
Function.createDelegate = function Function$createDelegate(instance, method) {
    /// <summary locid="M:J#Function.createDelegate" />
    /// <param name="instance" mayBeNull="true"></param>
    /// <param name="method" type="Function"></param>
    /// <returns type="Function"></returns>
    var e = Function._validateParams(arguments, [
        {name: "instance", mayBeNull: true},
        {name: "method", type: Function}
    ]);
    if (e) throw e;
    return function() {
        return method.apply(instance, arguments);
    }
}

这就是“委托”和“回调”的实现。
我们发现,这两个方法里面使用了这两个函数apply()和call(),这两个函数,是我们进行下一步学习的关键。下一篇我们专门研究吧!

最后废话几句:
其实,不仅Ajax,就是asp.net本身(指普通的WebForm),也只是(而且只能)利用JavaScript,form表单和服务端交互,关注研究aspx生成的页面,能帮助我们更深入的了解asp.net的运行机制。

转载于:https://www.cnblogs.com/freeflying/archive/2009/12/24/1631727.html

读源代码学Asp.net Ajax(一)相关推荐

  1. Java读源代码学设计模式:适配器Adapter

    适配器模式相关源代码:slf4j-1.6.1.hibernate-3.6.7 大家都知道.log4j是一个广泛使用的日志工具,除此之外.sun公司在JDK中也有自己的日志工具,也就是java.util ...

  2. [导入]ASP.NET Ajax程序设计第II卷:客户端Microsoft Ajax Library与异步通信层及源代码.zip(101.50 MB)...

    ASP.NET Ajax程序设计第II卷:客户端Microsoft Ajax Library与异步通信层及源代码 文章来源:http://www.isheu.com/data_8435_2.aspx ...

  3. 卢克,学着去读源代码

    读源代码卡住时,就要尝试从外围去看它,如API的结构,框架的设计图. 求知欲,耐心,勇气: 你能读懂吗?你能够读懂的. 跟着线索走 git是一个在开源社区里广泛应用的源代码管理工具.git clone ...

  4. SharePoint 2010中的客户端AJAX应用——ASP.NET AJAX模板

    WCF Data Services是SharePoint 2010中一个极具吸引力的新特性.然而,因为它的强大,直接对其进行编程仍然会有点痛苦.幸运的是,一个新的相关技术 -- ASP.Net AJA ...

  5. 合适么?现在学ASP.NET Core入门编程……

    现在都快找不到ASP.NET的培训课程了. 知道我要开课做培训,有同学劝我:"憋讲那什么.NET,讲Java,现在这个火!"我说我Java不熟,"唉呀!C#转Java,分 ...

  6. [转载]超酷代码-使用 ASP.NET AJAX 进行拖放

    原文地址 http://msdn.microsoft.com/msdnmag/issues/08/01/WickedCode/default.aspx?loc=zh AJAX 是对 Web 用户界面的 ...

  7. 和ASP.NET AJAX应用程序环游地球

    By Guy Smith-Ferrier 本文讨论: ASP.NET AJAX 的全球支持 需要对 JavaScript 的支持 基于程序集的 AJAX 本地化 基于文件的 AJAX 本地化 本文使用 ...

  8. Msdn 杂志 asp.net ajax 文章汇集

    asp.net ajax 充分利用客户端 JavaScript.DHTML 和 XMLHttpRequest 对象.其目的是帮助开发人员创建更具交互性的支持 AJAX 的 Web 应用程序 ASP.N ...

  9. ASP.NET AJAX学习记要(2)-下手之DOM

    要学习DOM,那什么是DOM?为什么要学习DOM?DOM是文档对象模型.借用网站w3pop.com上的一段话:["W3C文档对象模型(DOM)是一个能够让程序和脚本动态访问和更新文档内容.结 ...

最新文章

  1. .NET大会2021参会笔记
  2. java ee cdi_Java EE CDI Producer方法教程
  3. AUTOSAR从入门到精通100讲(126)-浅谈车载充电系统通信方案
  4. matlab案例_基于matlab和frost平台的cassie案例足式机器人运动学和动力学计算实现过程...
  5. Nginx反向代理Redis服务
  6. 演示对sys用户和普通用户进行审计的示例
  7. python打砖块游戏算法设计分析_python小游戏--打砖块的实现与讲解(python自学总结系列)...
  8. python程序启动其他python程序_python中使用fork创建新的进程
  9. 每天一道剑指offer-连续子数组的最大和
  10. hadoop包含哪些技术?
  11. MySQL如何把A表查询出来的某个字段的数据插入到新增的字段的下面
  12. Vuex的官方文档笔记
  13. 精读CSS权威指南第四版(1)
  14. TLQ的安装路径不存在或不正确
  15. python基础知识(五)---集合set
  16. redis之db(数据库)
  17. Ubuntu 16.04下安装Preempt_rt
  18. 安卓之位置服务(简单定位用户所在的位置)
  19. 清华计算机全球第4!USNews计算机专业排名出炉,67所大陆高校上榜
  20. Java语言程序设计与数据结构(基础篇)梁勇第一章书中例题

热门文章

  1. 乘法口诀表java加表格_Java 面试 - 打印九九乘法口诀表
  2. tor the onion router下载_盒马生鲜超市购物app下载,打开盒马鲜生小程序!
  3. php栏目树,php生成无限栏目树
  4. golang之正则校验(验证某字符串是否符合正则表达式)
  5. unity 3d换装之 SkinMeshRenderer
  6. Unity资源打包之Assetbundle
  7. [SheRO]用D3D绘制2D图像
  8. android 图库分析,Android开发之ImageSwitcher相册功能实例分析
  9. 计算机一级wps视频教程,计算机一级WPS
  10. 计算机保研英语,计算机专业保研面试英语自我介绍