博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让UpdatePanel支持文件上传(1):开始
阅读量:6638 次
发布时间:2019-06-25

本文共 2109 字,大约阅读时间需要 7 分钟。

 UpdatePanel从一开始就无法支持AJAX的文件上传方式。
写了一篇
解释了这个问题的原因。文章中提供了两个绕开此问题的方法:
  1. 将“上传”按钮设为一个传统的PostBack控件而不是异步PostBack。您可以使用多种方法来这么做:例如将一个按钮放置在UpdatePanel外,将按钮设为某个UpdatePanel的PostBackTrigger,或者调用ScriptManager.RegisterPostBackControl来注册它。
  2. 建立一个不使用ASP.NET AJAX的上传页面,很多站点已经这么做了。
  不过,我们为什么不使UpdatePanel兼容FileUpload控件(<input type="file" />)呢?如果可以这样,一定能够受需要使用UpdatePanel上传文件的用户欢迎。
  我们首先要解决的问题是,找到一种能够将信息发送到服务器端的方法。我们都知道XMLHttpRequest只能发送字符串。在这里,我们使用和其他的异步上传文件的解决方案一样,使用iframe来上传文件。iframe元素是一个非常有用的东西,即使在AJAX这个概念出现之前,它已经被用于制作一些异步更新的效果了。
  其次,我们应该如何改变当前传输数据的行为呢?幸亏Microsoft AJAX Library有着强大的 ,我们可以方便创建一个UpdatePanelIFrameExetender来继承Sys.Net.WebRequestExecutor,并且将它交给一个上传文件的WebRequest对象。因此,下面的代码可以作为我们开发组件的第一步:
第一步
Type.registerNamespace("Jeffz.Web");// the new executor will use the element witch initiated the async postback.Jeffz.Web.UpdatePanelIFrameExecutor = function(sourceElement){    // ...}Jeffz.Web.UpdatePanelIFrameExecutor.prototype ={    // ...}Jeffz.Web.UpdatePanelIFrameExecutor.registerClass(    "Jeffz.Web.UpdatePanelExecutor", Sys.Net.WebRequestExecutor);Jeffz.Web.UpdatePanelIFrameExecutor._beginRequestHandler = function(sender, e){    var inputList = document.getElementsByTagName("input");    for (var i = 0; i < inputList.length; i++)    {        var type = inputList[i].type;        if (type && type.toUpperCase() == "FILE")        {            e.get_request().set_executor(	        new Jeffz.Web.UpdatePanelExecutor(e.get_postBackElement()));            return;        }    }}Sys.Application.add_init(function(){    Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(        Jeffz.Web.UpdatePanelIFrameExecutor._beginRequestHandler);});
 
  在上面的代码段中,我们在页面初始化时监听了PageRequestManager对象的beginRequest事件。当PageRequestManager触发了一个异步请求时,我们会检查页面上是否有<input type="file" />控件。如果存在的话,则创建一个新的UpdatePanelIFrameExecutor实例,并分配给即将执行的WebRequest对象。
  根据异步通讯层的实现,WebRequest的作用只是一个保存请求信息的容器,至于如何向服务器端发送信息则完全是Executor的事情了。事实上Executor完全可以不理会WebRequest携带的信息自行处理,而我们的UpdatePanelIFrameExecutor就是这样的玩意儿。它会改变页面上的内容,将信息Post到IFrame元素中,并且处理从服务器端获得的数据。(未完待续)
本文转自 jeffz 51CTO博客,原文链接:http://blog.51cto.com/jeffz/59908,如需转载请自行联系原作者
你可能感兴趣的文章
MyBatis开发入门二:一对多连表查询
查看>>
洛谷——P2865 [USACO06NOV]路障Roadblocks
查看>>
POJ1191棋盘分割
查看>>
CF Exam (数学)
查看>>
这家素食店的牙签能吃——天厨妙香
查看>>
在UnrealEngine中用Custom节点实现毛玻璃的效果
查看>>
冒泡排序分析
查看>>
ORACLE数据库创建用户名和表空间
查看>>
oracle的监听器启动后一会儿便停止 再启动报错
查看>>
v4l2API无法执行VIDIOC_DQBUF的问题
查看>>
jdbc连接sqlsever2017的第一步
查看>>
PHP实现文件下载
查看>>
Echarts X轴时间类型
查看>>
Leangoo到底好在哪里?
查看>>
Firefly自动售货机解决方案
查看>>
操作系统的内存对齐机制学习笔记
查看>>
5款最好的免费Linux缓存系统
查看>>
Web开发者必知的12款jQuery插件
查看>>
一起谈.NET技术,.NET简谈观察者模式
查看>>
艾伟也谈项目管理,我眼中的DevOps
查看>>