2. 准备工作
宝山寻宝,准备工作是不可少的。要想探寻ASP.NET AJAX客户端的源码,就要知道它藏在哪里。当我们安装ASP.NET AJAX的时候,所有的文件都是打包在一个.NET assembly里面。路径在C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\v1.0.61025。里面还有一个子目录ScriptLibrary,所有的javascript文件都在那里。我们都知道,要在asp文件中放入scriptmanager server控件才能引用ASP.NET AJAX framwork的功能。当页面运行的时候,scriptmanager自动加载需要的js文件。

要探寻ASP.NET AJAX客户端的源码,静态的看这些js文件,那真是一头雾水。我习惯在debug状态下,从程序的运行流程来看个究竟。这就设计到javascript的debug。最好的选择还是visual studio。当然firefox下的firebug也是非常不错,尤其是最新的beta版本,甚至能显示资源文件的加载时间,非常有用。但在这里,我还是主要用visual studio。但是用vs debug javascript的时候,有一个比较麻烦的事情。所有的js文件都是用ScriptResource.axd来加载的,vs经常会报告source is not available的错误。这是vs的一个bug,在下一个版本中会克服。现在ASP.NET AJAX team推荐的方法是先在script explorer打开ScriptResource.axd文件,在设置断点。我发现在source is not available对话框出现之后,在script explorer中多点几次ScriptResource.axd文件也能把它们加到debug状态。一般是3次,真是个magic number。
但是这样作是非常麻烦的,尤其是在ScriptResource.axd设置的断点经常回消失。如果能直接引用ScriptLibrary下面的js文件,不用scriptmanager来加载,不就可以避开那些讨厌的ScriptResource.axd文件了吗?
办法很简单,察看有scriptmanager控件的aspx文件在浏览器所生成的html,直接拷贝给一个空的aspx文件。我们可以看到有两个script block比较重要。一个是


<script src="/AJAXEnabledWebSite1/ScriptResource.axd?d=lMnbk2xMvhfFR6p9MoFhfnYlPPgCr2MuGCVhNFMHbptiMgBIb3yQugVLbYXDHZf1x_2pokPvDlEMbCIK8Ax40wq0r-ugWI7eQIx91LNlJPIRqEUMuOMa0EjMNn_W4p1QRvbamFwk1bgZ0G0Vdf5JN89YZQFNBZRisDlHnqmO9XM1&amp;t=632995492340543312" type="text/javascript"></script>
<script src="/AJAXEnabledWebSite1/ScriptResource.axd?d=lMnbk2xMvhfFR6p9MoFhfnYlPPgCr2MuGCVhNFMHbptiMgBIb3yQugVLbYXDHZf1x_2pokPvDlEMbCIK8Ax40wq0r-ugWI7eQIx91LNlJPIRqEUMuOMa0EjMNn_W4p1QkDeVyDe8Pfm146kymHddo32dQuaF4xPHsplX2VtD6XI1&amp;t=632995492340543312" type="text/javascript"></script>


       
另一个是
<script type="text/javascript">
<!--
Sys.Application.queueScriptReference('
/AJAXEnabledWebSite1/ScriptResource.axd?d=7uF_GTgAOeKGLvD6J9FCtI3kf983jeYHOXTvMsN7IWll-J0IN38MzOCSnRQYyUlBcimpYWTmqgPME-5LC8VGZPzVWsssEP8bTqmfxdg3-OLc59j4Grfy-AJHCZ4Ol4Z-zQx5DTMW3JX_EpqHzlP10jG6D4bcnfJk9pgBPbYi_Z41&t=633002571267914016');
Sys.Application.queueScriptReference('
/AJAXEnabledWebSite1/ScriptResource.axd?d=7uF_GTgAOeKGLvD6J9FCtI3kf983jeYHOXTvMsN7IWll-J0IN38MzOCSnRQYyUlBcimpYWTmqgPME-5LC8VGZPzVWsssEP8bTqmfxdg3-OLc59j4Grfy-AJHCZ4Ol4Z-A7jjc59VmwyYiMsQt99dwVfmGgiuHnILRm6I5njs1eY1&t=633002571267914016');
Sys.Application.queueScriptReference('
/AJAXEnabledWebSite1/ScriptResource.axd?d=7uF_GTgAOeKGLvD6J9FCtI3kf983jeYHOXTvMsN7IWll-J0IN38MzOCSnRQYyUlBcimpYWTmqgPME-5LC8VGZPzVWsssEP8bTqmfxdg3-OLc59j4Grfy-AJHCZ4Ol4Z-vbzlqm6quIEjcgoqJiY3hzHJfOZk3meO2TrW23F42s41&t=633002571267914016');
Sys.Application.initialize();
// -->
</script>

把这两个block里面引用的resource文件换成对应的js文件。当然要先把ScriptLibrary中的文件拷贝到web site中。在文件中代码如下。
<script src="ScriptLibrary/Debug/MicrosoftAjax.js"></script>
<script src="ScriptLibrary/Debug/MicrosoftAjaxWebForms.js"></script>
<script type="text/javascript">
<!--
Sys.Application.queueScriptReference('
/AJAXEnabledWebSite1/ScriptLibrary/Debug/PreviewScript.js');
Sys.Application.queueScriptReference('
/AJAXEnabledWebSite1/ScriptLibrary/Debug/PreviewGlitz.js');
Sys.Application.queueScriptReference('
/AJAXEnabledWebSite1/ScriptLibrary/Debug/PreviewDragDrop.js');
Sys.Application.initialize();
// -->
</script>

还要注意的一点是scriptmanager会在js文件的结尾加入一些资源字符串和
Sys.Application.notifyScriptLoaded();方法调用。我们相应的要在这些js文件中加入同样的代码。
ok,现在来试一下,运行没有scriptmanager的aspx文件,文件正常运行,通过xml-script绑定的控件也都工作正常。不需要scriptmanager,我们也可以运行ASP.NET AJAX客户端的framework了。
准备工作已经结束。现在就让我们开始寻宝之旅,看看它的入口点吧。
posted on 2006-12-10 13:58  Blue Lotus  阅读(1792)  评论(9编辑  收藏  举报