最近在项目中经常用到模态窗口(showModalDialog),客户需要在一个模态窗口中有"生成Excel报表"并"导出"的功能。接到任务后,直接就开始按常规操作实现。
在按钮的Click事件中,根据模板生成Excel报表,填充数据,保存到临时文件夹,然后用Response.WriteFile函数输出文件,一切看上去都很顺利。代码如下:
//根据.net数据集创建Excel报表并返回Excel报表路径
string fileName = CreateExcel(ds);
Response.Clear();
Response.Charset = "utf-8";
Response.Buffer = true;
this.EnableViewState = false;
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
//设置输出文件类型为excel文件。
Response.ContentType = "application/ms-excel";
Response.WriteFile(fileName);
Response.Flush();
Response.Close();
Response.End();
但是当完成了代码,开始测试的时候,却发现点击"导出"按钮没有反应。开始的时候以为是创建Excel报表的代码有问题,但经过调试后,证实创建Excel代码没有问题,也成功的在临时文件夹下生成了Excel报表,但是却没有"导出"报表(没弹出下载文件对话框)。再看输出文件的代码,应该也没有问题,之前一直这样输出都没有问题的。
在百思不得其解的时候,发现了一个关键点。就是之前输出文件成功的面页都是一般的网页窗口,而这次的操作却是在模态窗口中。问题会不会出在这里呢?赶紧试验了一下。把模态窗口改成了一般的网页窗口,果然可以输出文件没问题,也成功下载了报表。
虽然问题有点怪异,但找到了切入点和问题的关键所在,解决应该就不难了。google一下,发现模态窗口定义了<base target="_self">,这应该是问题所在。然后在页面中重新定义了这个标签,改成了<base target="_blank">,问题成功解决,文件可以正常下载了。但这时候又来了新的问题,下载是可以了,但是却会弹出一个新页面,在模态窗口中下载再弹出页面肯定影响了用户体验。有没有方法在模态窗口中直接下载而不弹出新的页面呢?既然target=_self的时候有问题,target=_blank的时候又会弹出新的页面,这让我想到了在框架中打开新窗口的做法。在页面中加一个看不到的框架,然后把target设为框架名应该可以解决。随后在页面中再加了一个大小为0的iframe
<iframe></iframe><!--用.net的iframe模拟文件下载-->
然后重新修改<base>标签target为框架名:
<base target="download">
[asp-net]ElMAH(ASP.NET错误日志记录与通知)系列文章-基础应用 (佚名,04-20)
> ElMAH(ASP.NET错误日志记录与通知)系列文章-基础应用篇 最近在研究几个ASP.NET的开源项目时,发现都在使用ELMAH来作为记录整个应用程序的错误日志,于是拿来小研究了一下,在这里和各位分享一下,如果有使用过的,请多指教。 ……
Body> /// <summary> /// 导出Excel方法 &nb……
Body> /// <summary> /// 获取分页字符串(通用) /// </summary>……
> 存储过程的封装 只是做一个例子,别的可以仿照下面的例子改改就好了。 代码<!--Code highlighting produced by Actipro CodeHighlighter (freeware)……
> 开贴说说文本编辑器的那些事情-捕获输入内容原本应该先给大家说明一下程序框架的,不过,现在程序框架还没有定下来,所以暂时再给大家介绍一些具体的技术。这篇随笔告诉大家怎么获得输入的内容。 输入内容,随便Google一下的话,大概会出现以下……