asp.net导出excel并提供给客户端下载后,怎么给页面一个返回值

蓬莱东路走九遭 2013-11-22 05:25:15
页面<form>表单中有一个asp服务器控件的按钮和一个gridview,点击按钮,先执行OnClientClick,指向一个js函数,这个函数的功能是在页面增加一个Loading加载中效果的div,之后执按钮OnClick绑定的.cs文件中的函数,该函数会取得gridview的所有数据在服务器上生成一个excel文件,并输出给客户端弹窗下载,以上功能都完成了,现在的问题是,如何在当用户点击下载窗口上的保存、取消后,通知页面删除Loading加载效果的div

在前台加过hidden、select等控件,也加了属性ruant=server,打算通过在后台改变它的值来触发onChange事件通知页面,但当后台按钮单击的函数里同时写了导出excel、输出下载的代码后,改变控件值的代码没出效果,页面上的值并没被改变,后台注册js脚步也是一样

页面布局主要代码:
<body onload="load()" style=" background:#F4F4F4;">
<form id="form1" runat="server">
<asp:Button ID="btnExport" Text="导出Excel" OnClick="btnExport_Click" OnClientClick="loadingDelay(10000)" runat="server"/>

<div id="divMain_B">
<asp:GridView ID="gdvMain" runat="server" AutoGenerateColumns="False" Width="1150px"
GridLines="None" ShowFooter="True" DataSourceID="SqlDataSource1" ShowHeaderWhenEmpty="True"
EmptyDataText="    没有您查找的数据">


.cs文件中按钮单击事件绑定的函数:
//将gridviewd的数据导出到excel文件并发送到客户端下载(将在服务器磁盘上生成一份excel文件)
protected void btnExport_Click(object sender, EventArgs e)
{
//类似下面的这行代码去改变页面控件的值,均无效果,线程sleep也不行
this.sltLoadingTag.SelectedIndex = 1;

////grid导出excel文件
ExcelHelper helper = new ExcelHelper();
helper.ExceuteGridView(this.gdvMain, Page.Response);
}


ExceuteGridView函数最后的提供输出下载窗口的代码:
r.Clear();
r.Charset = "GB2312";
r.ContentEncoding = System.Text.Encoding.UTF8;
r.ContentType = "application/octet-stream";
//通知浏览器下载文件
r.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
// 添加头信息,指定文件大小,让浏览器能够显示下载进度
r.AddHeader("Content-Length", bytes.Length.ToString());
//使用二进制流传输(若使用r.WriteFile传输,将使下载后的excel文件格式异常)
r.BinaryWrite(bytes);
r.Flush();
r.End();
...全文
392 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
如果你的浏览器支持那种即使跨页面(页面刷新了之后)也能显示loading的玩意儿,那么你可以把下载操作改为“弹出窗口操作”的模式。在一个弹出窗口中执行下载文件,例如
ScriptManager.RegisterStartupScript(this, this.GetType(), "download", "window.open(.....); lodingCompleted();", true);
当前页面关闭loading,同时弹出窗口进行下载。 大多数浏览器,遇到这种内容类型为application/octet-stream的html页面(或者其他类似的页面),其实都不会弹出窗口,而会直接下载文件。
之前考虑过跳转到其他页面进行生成excel文件并下载,但这就需要将当前页面gridview中的数据传过去,不知道怎么传,如果只传几个参数过去再跑到数据库查出相应的数据又增加了服务器性能消耗等等
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
当页面刷新时,前面的loading已经不再了。 你根本用不着担心。
现在的情况也是有点奇怪,页面从点击了按钮后,一直没有刷新,按说我用的是asp.net服务器控件,也放到了form标签中,应该会回传刷新页面,但实际情况是没有刷,在body的load事件里加删除div的代码无法解决 我用的div+iframe的框架,自己搭的一个页面分页选项卡,兼容ie8、ie6即可
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
你可以附加状态在http头中 r.AddHeader("状态", 你的返回值);
能否给些具体的代码,针对我这个案例 刚才根据你的提示试图使用AddHeader刷新当前页面,无效果,没有刷新 按钮的后台单击事件函数里如果只写AddHeader刷新的代码,页面有刷新动作,但加上生成excel文件、下载的代码后,刷新无效果
  • 打赏
  • 举报
回复
如果你的浏览器支持那种即使跨页面(页面刷新了之后)也能显示loading的玩意儿,那么你可以把下载操作改为“弹出窗口操作”的模式。在一个弹出窗口中执行下载文件,例如
ScriptManager.RegisterStartupScript(this, this.GetType(), "download", "window.open(.....); lodingCompleted();", true);
当前页面关闭loading,同时弹出窗口进行下载。 大多数浏览器,遇到这种内容类型为application/octet-stream的html页面(或者其他类似的页面),其实都不会弹出窗口,而会直接下载文件。
  • 打赏
  • 举报
回复
当页面刷新时,前面的loading已经不再了。 你根本用不着担心。
threenewbee 2013-11-22
  • 打赏
  • 举报
回复
你可以附加状态在http头中 r.AddHeader("状态", 你的返回值);

62,263

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧