• 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ

鱼与熊撑如何兼得?(含有AJAX Control的页面中如何下载文件)(180分)

lanye_purple 2008-06-22 03:31:58
在我的主页面中,有一个GridView控件用来显示表单的公用属性列表,然后下面有一个FreeTextBox与DataList来显示表单的详细内容与附件列表.
现要实现点击附件列表中的附件后,将文件下载到客户机上.网上找了许多都是用Response里面的方法下载的.但在含有AJAX control的页面中,Response方法失效 错误提示: 系统错误 -1072896748 .于是,去掉AJAX control ,附件便正常下载到客户机上

于是,鱼与熊撑便出现了,即AJAX control 与 Response方法 下载文件.相应会有不少人遇到过此类问题,因此两者必须兼得.还望高手指点迷津~~~~(大家都讨论一下,回贴有分)

前台代码如下:

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:GridView ID="gvIndex" runat="server">
......
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>

<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:DataList ID="dlAttach" runat="server">
......
</asp:DataList>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="gvIndex" EventName="RowCommand" />
</Triggers>
</asp:UpdatePanel>



从服务器上面下载文件的代码
private void mircosoftDownFile(string serverFile,string fileName)
{
System.IO.Stream iStream = null;
byte[] buffer = new Byte[10000];
int length;
long dataToRead;
string filepath = serverFile;
// Identify the file name.
string filename = fileName;
try
{
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read, System.IO.FileShare.Read);

dataToRead = iStream.Length;

Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);

while (dataToRead > 0)
{
if (Response.IsClientConnected)
{
length = iStream.Read(buffer, 0, 10000);
Response.OutputStream.Write(buffer, 0, length);
Response.Flush();
buffer = new Byte[10000];
dataToRead = dataToRead - length;
}
else
{
dataToRead = -1;
}
}
}
catch (Exception ex)
{
Response.Write("Error : " + ex.Message);
}
finally
{
if (iStream != null)
{
iStream.Close();
}
}
}


前面提过此类问题,没有人解答,解决之后,分一并相送
http://topic.csdn.net/u/20080619/11/0a89a8ce-2719-40a4-bbb6-4eb5045d1608.html
...全文
215 点赞 收藏 20
写回复
20 条回复
jzywh 2008年06月24日
直接link而不postback不就行了?
回复 点赞
tiancaolin 2008年06月24日
[Quote=引用 3 楼 amandag 的回复:]
貌似现在不可行
[/Quote]
回复 点赞
lanye_purple 2008年06月24日
我现在整个页面基本上全部用updatepanel框起来..如果在显示附件的地方去掉updatepanel,则没有数据记录出来.也尝试过放一个Button按钮来刷新附件记录,效果不是很好..
回复 点赞
S170393163 2008年06月24日

碰到过

没有办法在不刷新的情况下下载

只有把下载按钮 放在updatepanel外 才能下载

只能让其刷新
回复 点赞
牛人 2008年06月24日
接点分咯.

支持一下
回复 点赞
lanye_purple 2008年06月24日
彻底失望了~~~~~
回复 点赞
lanye_purple 2008年06月24日

在网上找到一篇这样的贴子,试了一下,总是执行这句话:alert('用户连接超时,请重新登录!'); 大家都帮看看


之前项目里用了ajax.net,但是它控管javascript,所以在后台的Response.Write()起不到任何作用,都被ajax.net给截获了....不过还是有解决的办法~~ 首先,在<asp:ScriptManager ID="ScriptManager1" runat="server" />后面写一个脚本,这个脚本是用来捕获后台发出的Response请求,代码如下:
<script>
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
function EndRequestHandler(sender, args)
{
if (args.get_error() != undefined)
{
if(args.get_error().message.substring(0, 51) == "Sys.WebForms.PageRequestManagerParserErrorException")
{
alert('用户连接超时,请重新登录!');
window.location.href='<%=PageError()%>'; //出现Session丢失时的错误处理,可以自己定义。
}
else
{
alert("发生错误!原因可能是数据不完整,或网络延迟。"); //其他错误的处理。
}
args.set_errorHandled(true);
}
}
</script>

这样就解决了Response的问题了,不过后台还是必须得有Response的发送方法.....
http://blog.csdn.net/JevenMieer/archive/2008/05/21/2465047.aspx
回复 点赞
lanye_purple 2008年06月24日
难道真的没有解决方法吗?
回复 点赞
tinalucky 2008年06月24日
貌似不能兼得
回复 点赞
大自然D使者 2008年06月23日
关注并学习……………
回复 点赞
烈火焚身 2008年06月23日
up
回复 点赞
Pig23 2008年06月23日
asp.net ajax研究的不多,貌似此类框架都提供接口的,需要根据接口来写,不能直接response
回复 点赞
fellowcheng 2008年06月23日
关注下
【远方】专职路过UP
回复 点赞
nec_7788 2008年06月23日
回复 点赞
carl974 2008年06月23日
用这个方法吧, gridview的, Datelist应该一样


Protected Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated
If e.Row.RowType = DataControlRowType.DataRow Then
'假设在每一行有个按钮“btnDownloadFile" 击按钮就可以下载文件, 那么在RowCreated事件中加上这句
ScriptManager.GetCurrent(Me.Page).RegisterPostBackControl(e.Row.FindControl("btnDownloadFile"))
End If


本人的网站就是这样做的。
回复 点赞
林g 2008年06月23日
[Quote=引用 2 楼 tenors 的回复:]
不知道如何解决
jf
[/Quote]
回复 点赞
lanye_purple 2008年06月23日
那有没有什么折中的办法..这个问题困扰几天了...
回复 点赞
amandag 2008年06月22日
貌似现在不可行
回复 点赞
tenors 2008年06月22日
不知道如何解决
jf
回复 点赞
IcyPlayer 2008年06月22日
如果只要弹出下载文件的对话框,内嵌javascript:window.open(url)不可以吗?
回复 点赞
发动态
发帖子
.NET技术社区
创建于2007-09-28

4.9w+

社区成员

66.8w+

社区内容

.NET技术交流专区
社区公告
暂无公告