另一种Atlas Scripts Intellisense的方法以及对比与分析
2016-07-29 00:00
399 查看
多谢网友Beginor提供的信息:http://www.flanders.co.nz/Blog/2006/05/21/IntellisenseForAtlasXmlScript.aspx
上面的这个链接也提供了一种可以在VS里为Atlas Xml Script增加Intellisense的方法,它不仅是另一个work around,还有另外值得一提的地方,所以我也推荐文章的作者是转载了一个法国人提供的作法。法文我是看不懂了,不过根据代码和图片使用方法也了解了十之八九。具体步骤如下:
1、点击这里直接从国外下载或者点击这里从我的Blog下载所需的Schema。
2、将压缩包内的atlas.xsd复制到“%VS8_DIR%\Xml\Schemas”目录中。(比如在我的机器上就是:“D:\Program Files\Microsoft Visual Studio 8\Xml\Schemas”目录)。
3、将Atlas Xml Script内容写在另外的xml文件中,为了方便区分,可以使用atlas作为文件扩展名,例如“DynamicLoad.atlas”。
4、在atlas文件中添加<page xmlns=http://schemas.microsoft.com/xml-script/2005 />作为根节点,注意namespace一定要写正确,VS是根据这个来加载Schema的。于是,就可以使用Intellisense了。如图:
5、在使用该Atlas Xml Script的页面中加上如下一行:
<
link
type
="text/xml-script"
href
="DynamicLoad.atlas"
/>
6、在页面里添加如下的Javascript方法:
Sys.Application.load.add(
function
(){
var
linkElements
=
document.getElementsByTagName('link');
for
(
var
i
=
0
; i
<
linkElements.length; i
++
){
linkElement
=
linkElements[i];
if
(linkElement.type
=
'text
/
xml
-
script'
&&
linkElement.href){
var
request
=
new
Sys.Net.WebRequest();
request.set_url(linkElement.href);
request.completed.add(
function
(e){
Sys.MarkupParser.processDocumentScripts(
Sys.Application.getMarkupContext(),
e.get_xml().childNodes,
null
);
}
);
request.invoke();
}
}
}
);
可以看出,这种做法是在页面加载结束后使用Sys.Net.WebRequest类请求页面中通过<link />标识的xml文件,然后调用Sys.MarkupParse.processDocumentScripts方法解析每一个xml文件的内容,以得到和写在页面中的Atlas Scripts相同的效果。
我将上述方法和我的方法进行对比:
从安装方面考虑:显然上述的方法比我的方法简单不少,不用修改注册表,不用对VS进行设置等等。还好,这个是一劳永逸的做法。
从易用性方面考虑:两种方法可以说各有千秋。使用我的办法编辑时需要将tag在<script />与<atlasscript />之间修改,使用上述办法需要为使用Atlas Scripts的每个控件和每个页面都提供一个分离的Xml文件。
从性能方面考虑:我认为两者相差不多。使用上述的方法似乎会有一次多余的请求,但是如果做好Cache工作,这点性能上的损失可以忽略不计。
从兼容性方面考虑:我认为上述的方法不可取。我们不应该为了一个Intellisense功能而将Atlas Scripts的使用方式进行改变。如果使用了上述方法,那么从别的开发人员那里得到的页面很可能就会无法使用。另外,写在页面中的Atlas Scripts可以通过Server控件进行输出,这是上述方法无法做到的。因此,如果希望对于已有的Server端控件使用Atlas Script操作,就只能使用写在页面中的方法了——因为我们能够通过<%= this.xxx.ClientID %>输出服务器端控件在页面中的ID。
从Intellisense方面考虑:我目前的Schema还缺少部分Tag,而它的Schema比较完整,对我来说是一份很好的参考。只是我比较奇怪的是,它的Schema有不少问题,例如所有对象的“方法”也在提示中出现,这些多余的项会干扰选择。另外,它对于使用Xml Element表示的事件(比如hyperLink的click),缺少setProperty等Action的提示。还有就是……个人比较喜欢html中的Event(
)图标。:)
其实,如果上面的方法仅仅是另一种Intellisense的做法,那么我觉得可能就没有提及的必要。但是上面的做法有其自己的意义:它提供了一种使用Atlas Scripts的新方法,这会不会对我们有所启发呢?
上面的这个链接也提供了一种可以在VS里为Atlas Xml Script增加Intellisense的方法,它不仅是另一个work around,还有另外值得一提的地方,所以我也推荐文章的作者是转载了一个法国人提供的作法。法文我是看不懂了,不过根据代码和图片使用方法也了解了十之八九。具体步骤如下:
1、点击这里直接从国外下载或者点击这里从我的Blog下载所需的Schema。
2、将压缩包内的atlas.xsd复制到“%VS8_DIR%\Xml\Schemas”目录中。(比如在我的机器上就是:“D:\Program Files\Microsoft Visual Studio 8\Xml\Schemas”目录)。
3、将Atlas Xml Script内容写在另外的xml文件中,为了方便区分,可以使用atlas作为文件扩展名,例如“DynamicLoad.atlas”。
4、在atlas文件中添加<page xmlns=http://schemas.microsoft.com/xml-script/2005 />作为根节点,注意namespace一定要写正确,VS是根据这个来加载Schema的。于是,就可以使用Intellisense了。如图:
5、在使用该Atlas Xml Script的页面中加上如下一行:
<
link
type
="text/xml-script"
href
="DynamicLoad.atlas"
/>
6、在页面里添加如下的Javascript方法:
Sys.Application.load.add(
function
(){
var
linkElements
=
document.getElementsByTagName('link');
for
(
var
i
=
0
; i
<
linkElements.length; i
++
){
linkElement
=
linkElements[i];
if
(linkElement.type
=
'text
/
xml
-
script'
&&
linkElement.href){
var
request
=
new
Sys.Net.WebRequest();
request.set_url(linkElement.href);
request.completed.add(
function
(e){
Sys.MarkupParser.processDocumentScripts(
Sys.Application.getMarkupContext(),
e.get_xml().childNodes,
null
);
}
);
request.invoke();
}
}
}
);
可以看出,这种做法是在页面加载结束后使用Sys.Net.WebRequest类请求页面中通过<link />标识的xml文件,然后调用Sys.MarkupParse.processDocumentScripts方法解析每一个xml文件的内容,以得到和写在页面中的Atlas Scripts相同的效果。
我将上述方法和我的方法进行对比:
从安装方面考虑:显然上述的方法比我的方法简单不少,不用修改注册表,不用对VS进行设置等等。还好,这个是一劳永逸的做法。
从易用性方面考虑:两种方法可以说各有千秋。使用我的办法编辑时需要将tag在<script />与<atlasscript />之间修改,使用上述办法需要为使用Atlas Scripts的每个控件和每个页面都提供一个分离的Xml文件。
从性能方面考虑:我认为两者相差不多。使用上述的方法似乎会有一次多余的请求,但是如果做好Cache工作,这点性能上的损失可以忽略不计。
从兼容性方面考虑:我认为上述的方法不可取。我们不应该为了一个Intellisense功能而将Atlas Scripts的使用方式进行改变。如果使用了上述方法,那么从别的开发人员那里得到的页面很可能就会无法使用。另外,写在页面中的Atlas Scripts可以通过Server控件进行输出,这是上述方法无法做到的。因此,如果希望对于已有的Server端控件使用Atlas Script操作,就只能使用写在页面中的方法了——因为我们能够通过<%= this.xxx.ClientID %>输出服务器端控件在页面中的ID。
从Intellisense方面考虑:我目前的Schema还缺少部分Tag,而它的Schema比较完整,对我来说是一份很好的参考。只是我比较奇怪的是,它的Schema有不少问题,例如所有对象的“方法”也在提示中出现,这些多余的项会干扰选择。另外,它对于使用Xml Element表示的事件(比如hyperLink的click),缺少setProperty等Action的提示。还有就是……个人比较喜欢html中的Event(
)图标。:)
其实,如果上面的方法仅仅是另一种Intellisense的做法,那么我觉得可能就没有提及的必要。但是上面的做法有其自己的意义:它提供了一种使用Atlas Scripts的新方法,这会不会对我们有所启发呢?
相关文章推荐
- WPF/E CTP Quick Start - 第六部分:图像(翻译)
- F#中的XML序列化
- F#版本的CodeTimer(已支持CPU时钟周期统计)
- 老赵谈IL(2):CLR内部有太多太多IL看不到的东西,包括您平时必须了解的那些
- 是什么造成了MVP的尴尬现状?我们该怎么办?
- 从Atlas到Microsoft ASP.NET AJAX(7) - ScriptManager and ScriptManagerProxy Controls, Extender Controls
- 语言特性与API设计
- 迅雷推出“迅雷找到”服务
- 分清ASP.NET AJAX中的Extender和Behavior模型
- 祝老爸生日快乐!
- 分清“语言/规范”以及“平台/实现”,以及跨平台.NET开发
- 换了个Blog主题
- 深入Atlas系列:综合示例(1) - 调用服务器端方法时直接获得客户端具体类型
- Writing Secure Code Third Edition
- Animation全接触(前言)
- 为ASP.NET AJAX 1.0 Beta补充trace和dump功能
- 为WebForms说几句话,以及一些ASP.NET开发上的经验(2)
- 一个简单的性能计数器:CodeTimer
- 编程语言的发展趋势及未来方向(1):历史回顾及趋势概述
- 微软:两大法宝让HD Photo取代JPEG