读源代码学Asp.net Ajax(一)

本文通过对比分析ASP.NET AJAX引入scriptmanager前后页面源代码的变化,深入探讨了scriptmanager的作用及背后的JS文件引用机制。重点解读了scriptresource.axd和webresource.axd文件的功能与配置,以及它们如何通过时间戳参数确保资源的有效加载。进一步,文章揭示了'委托'和'回调'的实现原理,指出这些核心概念对于理解ASP.NET AJAX交互机制至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


======================================================
注:本文源代码点此下载
======================================================

本文希望为有一定基础的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&t=633924497349218750" type="text/javascript">script>

script src="/website1/scriptresource.axd?d=dteldd7tk8ezocfu5cem7a0ajrkvnjxhtjkljtwp_ejvqj6_mefjff0kgiixspclhj3qodnhpgeejsporkqzwgyl4vk7cm_kcafgg0e_euy1&t=763bd652" type="text/javascript">script>

script src="/website1/scriptresource.axd?d=dteldd7tk8ezocfu5cem7a0ajrkvnjxhtjkljtwp_ejvqj6_mefjff0kgiixspcltdp4o_k8y1mspveedbwrwtwbunzbt5t5qhedmws7niijtyuarztdlkxodrdybkuc0&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; il; 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) {

/// ="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的运行机制。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值