CharlesChen's Technical Space

简单实用是我一直在软件开发追求的目标(I Focus on. Net technology, to make the greatest efforts to enjoy the best of life.)
Not the best, only better
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

     在项目中用到了改变上传控件的样式,最后通过不断尝试终于实现了想要的效果:移动项目开发笔记(改变文件上传控件的默认风格) ,实现了普通的文件上传控件所实现的功能。但是随着项目的开发以及根据客户提出的需求,为了能给用户带来更好的用户体验,需要让页面不刷新而提交页面,也就是说需要使用Ajax技术,其实在asp.net ajax框架能很好的把页面实现成不刷新的(确切的说是使用asp:UpdatePanel控件把整个页面上form表单包含起来,这样就能实现不刷新页面提交)。但是这给项目中的上传控件提出了一个很大的挑战:也就是说上传控件在UpdatePanel中无法实现不刷新的异步上传。

下面是一些解决方案,能力有限,希望朋友们提出宝贵的意见以及更好的解决方案:欢迎朋友们指正。谢谢!

1.在UpdatePanel中的ContentTemplate中直接放置Asp:FileUpload

Code
按钮 btnUpload后台代码事件如下:
Code

然而当选择一个文件并点击按钮时候最后的效果是

结果:也就是说后台无法访问到上传控件中选择到的值。(UpdatePanel是部分刷新的,并没有把我们上传的文件转换成流传送到服务器端)

 

2.UpdatePanel中的Triggers指定上传的按钮并同步发送整个页面

Code
按钮btnUpload事件代码如下:
Code

最后选择文件点击按钮时候效果

结果:虽然能够在服务器端访问到用户选择文件的值,但是页面产生了回发,不满足不刷新而上传文件.

3.通过Iframe框架页面实现文件上传

IframeUpload.aspx页面

Code
其中Iframe/UploadFrame.aspx页面为:
Code

结果:这样的话上传的功能就完全交给了Ifram/eUploadFrame.aspx框架页处理了,和普通的上传没什么两样。然后这样能给客户比较好的体验,也就是说当前页面(使用UploadFrame.aspx的页面IframeUpload.aspx),就实现了无刷新页面处理数据。(虽然UploadFrame实现了刷新,但是对于iframeUpload.aspx来说是没有刷新的,可以给用户带来比较好的体验).

 

4.通过设置From的Target属性来模拟不刷新上传(实质上是刷新的,只是用户看不见)

思路:通过设置Form的Target属性为Iframe的Name属性来隐藏刷新部分.

Code

后台事件:

Code

 

结果:当点击按钮后,页面并没有刷新,刷新的是隐藏的Iframe框架(通过设置Form的Target属性),不过由于Iframe的style="display:none",所以用户无法看到,就像没有刷新一样。这样就进一步的增强了用户的体验,模拟了不刷新而异步上传的效果.

5.通过window.open弹出页面实现上传,将上传后的文件返回给主页面

Code

Iframe/UploadFrame.aspx代码和普通没什么两样(需要注意在<Head></Head>之间加了<base target="_seft"></base>)表示在本页中打开

Code

最后效果:

结果:将上传文件引起的刷新问题转移到新打开的页面中,避免了主页面的刷新问题,这样也增强了用户体验.

6.通过一些支持Ajax上传文件的组件(略)

 

上面是我个人对文件上传这个功能的一点理解和解决方案,欢迎朋友们提出其他解决方案,也可以对上面几种解决方案给出评价,谢谢朋友们的支持。

 Regards,

Charles Chen

msn:Charles.C.Chen@newegg.net

Email:gotosunny@msn.com