随心所欲

做个幸福的人
posts - 147, comments - 1402, trackbacks - 28, articles - 0
  博客园 :: 首页 :: 新随笔 ::  :: 订阅 订阅 :: 管理

Atlas:在UpdatePanel里面上传附件

Posted on 2006-07-11 09:33 随心所欲 阅读(5899) 评论(34)  编辑 收藏 网摘 所属分类: AJAX : Atlas
上次说到(和Atlas专家探讨Atlas的一些Bug和疑问),在Atlas里面使用FileUpload上传附件有困难:UpdatePanel每次回发的只是一个XmlHttp的请求和ViewState,并没有回发整个页面,所以,在server端无法获得FileUpload的文件。

首先想到的解决方法就是不使用UpdatePanel:弹出一个新窗口,上传文件。新窗口里面不使用UpdatePanel。 这个方法当然可以。

今天忽然想起来,GMail里面的附件上传:后台上传文件,还不影响你前边邮件的编辑,也不整体页面刷新。这个模式够帅!不用打开新窗口,一个页面搞定,页面也不用刷新。

对比了一下,好象第二种方法更好一点。于是FireBug(AJAX程序的跟踪工具:fireBug0.4)了一下GMail,发现了里面的处理是这样的
<iframe scrolling="auto" frameborder="0" onload="try{if(top.js.init)top.js._IF_OnLoaded('v1')
<input type="file" onchange="top.js._CM_OnAttach(window,this)" name="f_ephki04a" size="50"/>
他的上传附件是放在一个iframe 里面的,然后控件的onchange事件里面有些处理。

果然是个不错的方法。
于是我做了这样的处理方案:
1:主页面中使用UpdatePanel,然后UpdatePanel里面放置的不是FileUpload控件,而是一个Iframe
2:这个iframe在链接一个新的页面,那个页面里面有FileUpload控件。
3:上传完毕后,告诉主页面上传得结果

先看一个直接使用FileUpload的例子:这个例子里面,服务端是无法找到上传文件的。
            <atlas:UpdatePanel ID="up1" Mode="Conditional" runat="server">
                
<ContentTemplate>
                    
<asp:FileUpload ID="FileUpload1" runat="server" />
                    
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
                 
</ContentTemplate>
            
</atlas:UpdatePanel>

看看,我们该如何实现
1:新建主页面Default.aspx
      在适当的位置,放置一个上传附件的UpdatePanel区域
     
            <atlas:UpdatePanel ID="up_attachment" Mode="Conditional" runat="server">
                
<ContentTemplate>
                   
<iframe id="file" name="file" src="attachment.aspx"></iframe>
                
</ContentTemplate>
            
</atlas:UpdatePanel>
2:新建上传文件的页面attachment.aspx,然后放上FileUpload控件
<div>
    
<asp:FileUpload ID="FileUpload1" runat="server" />
          
<asp:Button ID="Button1" runat="server" Text="OK" OnClick="Button1_Click" />
    
</div>
3:在attachment.aspx里面,上传文件之后调用主页面的js,报告上传情况。这是函数原型:
    <script>
      window.top.callBack(fileName);
    
</script>
4:Default.aspx主页面里面增加这个函数,处理返回值
  
    <script>
     function callBack(fileName)
     
{
        document.getElementById(
'Attach1').innerHTML=fileName;
     }

    
</script>


然后,搞定。
这个方案,虽然还是两个页面,但是看起来处理都在一个页面里面,页面处理无刷新。

Feedback

#1楼    回复  引用    

2006-07-11 10:18 by 同舟共济 [未注册用户]
有用

#2楼    回复  引用  查看    

2006-07-11 10:28 by 阿不      
确实是一个不错的方案。我有看过的无刷新的上传解决方案中也是使用iframe的,比如:AspnetUpload,FCKEditor的上传。我也来试试。

#3楼 [楼主]   回复  引用  查看    

2006-07-11 10:31 by 随心所欲      
@同舟共济
如果有时间,我就把他做成一个控件。

#4楼 [楼主]   回复  引用  查看    

2006-07-11 10:31 by 随心所欲      
@阿不
放心,测试过了,没有问题。
看起来也很帅。
虽然方法曲线了一点,但是结果是好的。

#5楼    回复  引用    

2006-07-11 10:35 by leeight262 [未注册用户]
不放到iframe里面也可以。
<iframe name="a"></iframe>
<form method="post" target="a">
<input type="file" />
</form>

这样子也可以实现无刷新的效果。

在x2blog上面学的

#6楼    回复  引用  查看    

2006-07-11 10:37 by 阿不      
@leeight262
这样也能放在Atlas的Updatepanel吗?

#7楼 [楼主]   回复  引用  查看    

2006-07-11 10:41 by 随心所欲      
@leeight262
不再两个页面里了。
但是看原理,还是两个文件(两个form)中分别处理。
看起来写法简单。

不过,我还不太习惯在aspx里面放置两个form。

#8楼 [楼主]   回复  引用  查看    

2006-07-11 10:42 by 随心所欲      
@leeight262
应该也是个不错的选择方案,感谢。

#9楼    回复  引用    

2006-07-11 10:59 by 閮界潱 [未注册用户]
基本同意

#10楼    回复  引用  查看    

2006-07-11 11:30 by 亦续缘      
document.getElementById('Attach1').innerHTML=fileName;

找不到ID='Attach1'.能不能说一下,谢谢!或者能不能给出个例子。

#11楼 [楼主]   回复  引用  查看    

2006-07-11 11:34 by 随心所欲      
@亦续缘
这种写法只是一些伪码。
意思是,把返回的值写道你自己需要的地方(就是自己用来显示的控件的ID)

如果你想测试:
你在Default.aspx里面放上一个TextBox,Id='Attach1', 就可以了。
返回的那个函数也得相应的修改成真正的函数。

#12楼    回复  引用    

2006-07-14 18:10 by dddv [未注册用户]
说了这么久你都没有告诉我们哪里有Atlas下载啊。给个下载地址吧

#13楼 [楼主]   回复  引用  查看    

2006-07-14 20:36 by 随心所欲      
@dddv
到他的主页上去找,应该会有的
http://atlas.asp.net/default.aspx?tabid=47

#14楼    回复  引用    

2006-07-21 11:43 by kiven [未注册用户]
不错的一个方法,学习中........

#15楼    回复  引用    

2006-07-28 17:11 by york [未注册用户]
两个form的怎么做?给个地址

#16楼    回复  引用    

2006-08-18 11:40 by snowyon [未注册用户]
我发现一个问题,用楼主的方法,虽然可以成功,但是,我发现当加入iframe时候,主页面,每当我把BUTTON1按下时候,明显页面还是刷新了,感觉UPDATEPANEL没起到作用

#17楼    回复  引用    

2006-09-02 09:54 by ff [未注册用户]
不行,用不起,报错

#18楼    回复  引用    

2006-09-02 09:55 by ff [未注册用户]
这个 filename是从哪里取的值??没写清楚

#19楼    回复  引用    

2006-09-18 21:07 by lovan [未注册用户]
你说的这个问题,是个解决的好方法,但是只不过Default.aspx中iframe外的地方没有更新而已,并不是真正的刷新,同时还有下面一个问题:在Default.aspx里面点OKButton 的事后,浏览器最下面的状态栏还是显示着加载。我发现在magic Ajax里面也有同样的问题。这个似乎与Javascript的本质有点关系吧!期待更好的解决方案!
谢谢啊!

#20楼 [楼主]   回复  引用  查看    

2006-11-30 17:47 by 随心所欲      
@ff
the "fileName" is from the fileUploader at attachment.aspx. this is the param to send back to the pre page

#21楼    回复  引用  查看    

2007-01-05 08:19 by yunhuasheng      
@leeight262
这个也是一个方法.

#22楼    回复  引用  查看    

2007-01-05 08:20 by yunhuasheng      
写的不错!

#23楼    回复  引用    

2007-02-06 10:04 by ee [未注册用户]
最好能在提供一个上传的进度条就好了

#24楼 [楼主]   回复  引用  查看    

2007-02-06 12:35 by 随心所欲      
@ee
计算进度有点困难....

#25楼    回复  引用  查看    

2007-03-26 11:10 by Edwin dong      
现在正在找这个东西呢,博主简直是帮我了一个大忙了,谢谢

#26楼 [楼主]   回复  引用  查看    

2007-03-26 11:41 by 随心所欲      
@Edwin dong
喜欢就好。

#27楼 [楼主]   回复  引用  查看    

2007-03-26 11:43 by 随心所欲      
@ee
找到了一个方法,过段时间写出来

#28楼    回复  引用    

2007-03-27 09:35 by coffeefox [未注册用户]
刚开始研究这个东西
说的好模糊啊
怎么也搞不定……

#29楼 [楼主]   回复  引用  查看    

2007-03-27 14:53 by 随心所欲      
@coffeefox
这里的介绍已经比较详细了。动手试试。

#30楼    回复  引用  查看    

2007-03-28 16:20 by 野猪&翔帅      
学习

#31楼    回复  引用    

2007-04-03 17:57 by 事实 [未注册用户]
filename那来的?写清楚啊,菜鸟看不懂

#32楼 [楼主]   回复  引用  查看    

2007-04-04 23:03 by 随心所欲      
@事实
attachment.aspx里面的那个上传按钮在触发时,得到上传文件的名字。

#33楼    回复  引用    

2007-08-13 20:21 by yymycabbage [未注册用户]
在default.aspx 页面上按 提交按钮 后,通过调用 attachment.aspx页面上的form.submit()来提交页面,却怎么也获得不了文件,
但是在attachment.aspx页面上直接按按钮提交却成功获得文件,
请问问题会是出在哪边呢?
以前好像成功过,现在死活不行了,郁闷!

#34楼    回复  引用  查看    

2008-10-20 21:41 by cloudgamer      
可以参考一下这个无刷新文件上传系统
http://www.cnblogs.com/cloudgamer/archive/2008/10/20/1314766.html




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-07-12 11:04 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接:
 
Google