让UpdatePanel支持文件上传(4):数据传输与解析机制

现在就要开始整个项目中最有技巧的部分了。如果我们的组件需要在多种浏览器中正常的运行,我们必须好好考虑一下发送和解析数据的方式。如果我们把这部分的机制完全交给ASP.NET AJAX原有的行为来执行,则会遇到问题。下面的代码片断就是IE 7和FireFox在收到服务器端的数据之后,iframe中的DOM结构:

<html><head></head><body><pre>33|updatePanel|ctl00_Main_UpdatePanel1|...</pre></body></html>

很显然,这段代码的意图是为了在页面中直接显示服务器端发送过来的数据。在这种情况下,我们就可以通过“<pre />”元素的innertText属性(IE 7)或者textContent属性(FireFox)来直接获得这段文字。不幸的是,IE6的行为非常奇怪,与前两者可谓大相径庭。IE 6会把这段文字按照XML来解析,接着很自然的显示出错误信息,告诉我们这段文本不是一个有效的XML文档。这非常不合理,因为Response的“Content-Type”是“text/plain”而不是“text/xml”。这是我们要兼容多个浏览器时最头疼的情况。

还记得我们在向客户段输出真实的数据前后都调用了WriteScriptBlock方法吗?下面就是这个方法的实现:

internal static class AjaxFileUploadUtility
{internal static void WriteScriptBlock(HttpResponse response, bool begin){string scriptBegin = "<script type='text/javascript' language='javascript'>window.__f__=function(){/*";string scriptEnd = "*/}</script>";response.Write(begin ? scriptBegin : scriptEnd);}
}

IE 6和IE 7会将使用<script />来包含的文本作为一段脚本代码来处理。我们这里在真实的数据两边加上了脚本定义的内容,使它成为了客户端iframe中“__f__”方法的一段注释,因此我们可以通过调用这个方法的toString函数来获得这个方法的文本内容。请注意在RenderPageCallback方法中,我们把文本进行了编码,将“*/”替换为“*//*”,然后再将其发送到客户端,这么做的目的是使这段文本能够成为合法的JavaScirpt代码。

StringBuilder sb = new StringBuilder();
HtmlTextWriter innerWriter = new HtmlTextWriter(new StringWriter(sb));
renderPageCallbackMethodInfo.Invoke(this.PageRequestManager, new object[] { innerWriter, pageControl });writer.Write(sb.Replace("*/", "*//*").ToString());

等一下,我们在这里把异步刷新运行正常时输出的文本进行了编码,但是我们在异常情况下的输出并没有这么做,不是吗?没错。因为在异常状况下,错误信息会通过Response的Write方法直接输出(请看PageRequestManager类的OnPageError方法),因此我们无法向前面的代码那样获得它输出的结果。我们现在只能希望错误信息中不要出现“*/”这样的字符串吧(当然,我们可以使用反射机制来重写整个逻辑,但是这样做实在比较复杂)。

下面,我们就要在客户端的_iframeLoadComplete方法中重新获取这段文本了:

_iframeLoadComplete : function()
{//...try{    var f = iframe.contentWindow.__f__;var responseData = f ?  : ;if (responseData.indexOf("\r\n") < 0 && responseData.indexOf("\n") > 0){responseData = responseData.replace(/\n/g, "\r\n");}this._responseData = responseData;this._statusCode = 200;this._responseAvailable = true;}catch (e){this._statusCode = 500;this._responseAvailable = false;}// ...
},_parseScriptText : function(scriptText)
{var indexBegin = scriptText.indexOf("/*") + 2;var indexEnd = scriptText.lastIndexOf("*/");var encodedText = scriptText.substring(indexBegin, indexEnd);return encodedText.replace(/\*\/\/\*/g, "*/");
},

我们在这里将判断iframe的window对象中是否存在“__f__”方法,而不是直接判断浏览器的类型来决定下面要做的事情,因为这样可以带来更多的浏览器兼容性。

FireFox的行为则完全不是这样的,它依旧使用我们一开始提到的那种DOM结构,把从服务器端得到的文本显示在iframe中,这种做法比较合理,因为Response的Content-Type为“text-plain”。因此,我们会使用另一种方法来得到这段文本:

_parsePreNode : function(preNode)
{if (preNode.tagName.toUpperCase() !== "PRE") throw new Error();return this._parseScriptText(preNode.textContent || preNode.innerText);
},

请注意,“_iframeLoadComplete”方法中还有几行非常重要的代码:

if (responseData.indexOf("\r\n") < 0 && responseData.indexOf("\n") > 0)
{responseData = responseData.replace(/\n/g, "\r\n");
}

由于从服务器端得到的脚本将会被分割为多个部分,每个部分的格式为“length|type|id|content”,因此字符串的长度是在解析文本时非常重要的属性。因此,我们将会把所有的“\r”替换成“\r\n”,以此保持内容和长度的一致,否则解析过程将会失败。而且事实上,这样的替换只会出现在FireFox中。(未完待续)

 

点击这里下载整个项目

English Version

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

删除计算机360云盘,win7系统怎么取消电脑右键保存到360云盘选项

在日常使用win7系统的时候&#xff0c;我们经常会用到右键菜单&#xff0c;可是有时候会遇到一些没有用的选项&#xff0c;比如保存到360云盘选项&#xff0c;如果不喜欢的话&#xff0c;要怎么取消电脑右键保存到360云盘选项呢&#xff1f;具体步骤如下。1、首先有这一项的都是…

Unity3D笔记十五 碰撞、移动

碰撞 Collision. [kəˈliʒən] 碰撞&#xff1b;冲突&#xff1b;&#xff08;意见&#xff0c;看法&#xff09;的抵触&#xff1b;&#xff08;政党等的&#xff09;倾轧 选择一个需要添加碰撞器的游戏对象后 Component->Physics- Unity一共为对象提供了6 种碰撞器&…

网吧服务器RAID 0+1硬盘阵列组建图解

网吧服务器RAID 01硬盘阵列组建图解步小羽   2007年04月13日   来源&#xff1a;天下网吧联盟随着网吧规模扩大&#xff0c;网吧电脑数量也会相应增加&#xff0c;上网的顾客也随之增多&#xff0c;服务器硬盘数据存取的速度将会成为新的瓶颈&#xff0c;很多顾客开始投诉服务…

大工17秋《计算机文化基础》在线测试1,奥鹏大工15秋《计算机文化基础》在线测试1答案...

一、单选题(共 10 道试题&#xff0c;共 50 分。)V1. 二进制数11111010所对应的十进制数是( )。A. 250B. 252C. 253D. 255满分&#xff1a;5 分2. 在计算机领域中&#xff0c;( )通常用英文单词“byte”来表示。A. 字B. 中央处理器C. 字节D. 位满分&#xff1a;5 分3. 下列…

VXLAN实验

拓扑图&#xff1a; SPINE配置&#xff1a; hostname SPINE-1vdc SPINE-1 id 1 limit-resource vlan minimum 16 maximum 4094 limit-resource vrf minimum 2 maximum 4096 limit-resource port-channel minimum 0 maximum 511 limit-resource u4route-mem minimum 248 maximum…

终于开始工作了

在来到上海的 第三周我开始了我的第一天的工作&#xff0c;今天的主要任务是看老大给的资料&#xff0c;看了一天&#xff0c;下班的时候居然还下着雨&#xff0c;又没拿伞&#xff0c;只有被浇了&#xff0c;呵呵&#xff0c;可怜了我姐姐送我的880的西服。如果让她老人家知道…

桂林电子科技大学计算机专业排名,桂林电子科技大学专业排名怎样

桂林电子科技大学专业排名怎样桂林电子科技大学是工业和信息化部与广西壮族自治区共建高校、广西壮族自治区重点建设高校。小编整理了关于桂林电子科技大学专业之间的排名&#xff0c;希望对大家有帮助!桂林电子科技大学专业排名情况1、 通信工程 推荐指数: 4.8(156人推荐)2、 …

Ubuntu使用记录

经一个朋友推荐决定使用Ubunta&#xff0c;主要被他说的&#xff0c;对个人Destop使用非常方便&#xff0c;所吸引网上被评价为最受个人用户青睐的Linuxhttp://distrowatch.com/排名据说第一漂亮的界面&#xff0b;强大的资源支持了解Ubuntuubuntu8.04光盘安装图文指南 分区设置…

VSTS For Testers读书笔记(5)

四、编辑WebTest3、添加提取规则和自定义提取规则添加提取规则1、当必须从特定页中捕获一部分数据并且供另一个页使用时&#xff0c;就需要用到提取规则。可以使用提取规则从响应中复制字符串&#xff0c;然后将字符串存储到上下文变量中&#xff0c;以供任何后续请求使用。通过…

html里面怎么ul加高度,div里面嵌套了ul,为什么div的高度小于ul高度

div高度见阴影部分ul高度见阴影部分实现的html代码如下&#xff1a;热门推荐css代码如下&#xff1a;.navBar {clear: both;width: 100%;border: solid;/*border-top: solid;*/border-bottom: solid;border-width: 1px;border-color: #dddddd;margin:0px;height: 1.5em;}.navBa…

Eclipse 插件开发中的 classnotfound 问题 zz

目的&#xff1a;Eclipse插件开发中&#xff0c;经常要引用第三方包或者是引用其他插件中的类&#xff0c;由于插件开发环境引用类路径的设置和运行平台引用类路径的设置不同&#xff0c;经常导致开发过程OK&#xff0c;一旦运行则出现NoClassDefFoundError的问题。本文的目的是…

Asp.net2.0水晶报表的一些示例源码

最近关注了一下Asp.net2.0中水晶报表的资料&#xff0c;发现示例少之又少&#xff08;怀疑是水晶报表免费的比较少的缘故&#xff09;&#xff0c;搜集到了Asp.net官方的许多示例源码&#xff0c;试了几个还不错&#xff0c;这里发给大家分享一下&#xff08;我仅把Asp.net C#部…

SP2中修复IE浏览器的一些技巧

点击链接但没有反应;在开始菜单的运行对话空中输入URL&#xff0c;但不能弹出IE窗口。以上仅是用户所遇的众多问题中的两种。人们处理该问题的一个简单方法就是重新安装IE.它也确实有用&#xff0c;但你会发现重新安装IE对于这个较简单的问题到显得小题大做了。IE的许多这类问题…

Why Would I Ever

why would i ever why would i ever我怎么可能会&#xff08;那样&#xff09;why would i ever think of leaving you我怎么可能会想离开你why would i ever, why would i ever我怎么可能会&#xff08;那样&#xff09;why would i ever think of leaving you我怎么可能会想离…

我的跳槽经验

终于辞职了。从春节后偷偷摸摸找工作开始&#xff0c;到今天辞职&#xff0c;真是一段难熬的时期啊。要离开原来的公司了&#xff0c;但还是有点舍不得&#xff0c;领导同事都很优秀&#xff0c;只是每个人都有自己要辞职的原因。我这里只是写一下自己辞职的过程和想法&#xf…

计算机网络作业6,计算机网络作业 6

请回答下列问题&#xff1a;(1)主机在配置IP地址时&#xff0c;其正确的子网掩码和默认网关分别是多少&#xff1f;(2)若路由器R在向互联网转发一个由主机192.168.1.5发送、ID12345、length500B、DF1的IP分组时&#xff0c;则该IP分组首部的哪些字段会被修改&#xff1f;如何修…

QQ2007 Beta2 下载地址泄露

QQ2007 Beta2地址的地址已经泄露,来自腾讯官方论坛的一位能体验的朋友.安装完要求重启电脑,不过貌似目前非相关测试人员无法登录这个版本,当然聪明的网友们还是会自己想办法搞定 :)尊敬的QQ用户,您幸运地被腾讯公司选中参与QQ2007Beta2试用,我们很高兴有这个机会可以让小部分用…

计算机专业英语的理解,计算机专业英语之理解网络地址

理解网络地址你可以把万维网想象成一个存储在世界各地计算机上的电子文件的网络。超文本把这些资源链接在一起。统一资源定位器或者称之为URL是用来定位这些文件的地址。你只需单击一下鼠标&#xff0c;URL中包含的信息就可以让你从一个网页直接跳到另一个网页。当你在浏览器中…

区别不同浏览器,CSS hack写法

区别不同浏览器&#xff0c;CSS hack写法&#xff1a; 区别IE6与FF&#xff1a;background:orange;*background:blue; 区别IE6与IE7&#xff1a;background:green !important;background:blue; 区别IE7与FF&#xff1a;background:orange; *background:green; 区别FF&#xff0…

画江恩线

有同学问江恩线的画法。俺这次讲仔细了。希望喜欢江恩理论的同学们都可以学会了。因为讲一次很麻烦的。上图是大盘周线图的江恩线。 江恩理论的核心是用历史来发现未来。所以想学习江恩理论的同学必须明白这其中的关键。凡是没有这历史未来观的江恩理论学习都是瞎扯淡。就像缠…