`

showModalDialog 下载文件问题

阅读更多

showDialog里好像不能用href,只能用onclick

最近在项目中经常用到模态窗口(showModalDialog),客户需要在一个模态窗口中有"生成Excel报表"并"导出"的功能。接到任务后,直接就开始按常规操作实现。
    在按钮的Click事件中,根据模板生成Excel报表,填充数据,保存到临时文件夹,然后用Response.WriteFile函数输出文件,一切看上去都很顺利。代码如下: 

            //根据数据集创建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 id="download" name="download" height="0px" width="0px"></iframe><!--用iframe模拟文件下载-->
然后重新修改<base>标签target为框架名:

<base target="download">
重新生成,浏览,测试。问题成功解决。


 

分享到:
评论

相关推荐

    showModalDialog技术文章

    5. **兼容性问题**:由于`showModalDialog`在现代浏览器中的支持度已经下降,文章可能会提到与IE、Firefox、Chrome等浏览器的兼容性问题,以及替代方案。 6. **优点和缺点**:分析`showModalDialog`相比于其他弹窗...

    showModalDialog用法

    然而,需要注意的是,`showModalDialog`在现代Web开发中逐渐被弃用,因为它不支持跨域,且存在一些浏览器兼容性问题。例如,Internet Explorer 11以上版本已经移除了这个函数,而Chrome和其他基于 Blink 的浏览器也...

    Window.ShowModalDialog使用手册

    在JavaScript编程语言中,`Window.showModalDialog()`方法是一个非常重要的功能,主要用于打开一个模态对话框,即用户必须关闭对话框才能与父窗口进行交互。这个方法在创建用户交互和自定义弹出窗口场景中非常有用。...

    window.showModalDialog模式对话框和 window.open的区别

    这些文件可能用于实现用户管理或人员选择等功能,与`window.showModalDialog`和`window.open`的使用直接关联不大,但在实际Web应用中,这些JSP文件可能会用到这两种弹窗方法来创建用户交互界面。例如,`member-admin...

    window.showModalDialog('d.html',fault,'');

    压缩包中的 'd.html' 文件可能是用来展示 `showModalDialog` 的示例页面,而 'c.html' 文件可能是一个上下文相关的页面,或者是用来触发对话框的源页面。由于具体文件内容不可见,无法进一步分析其细节。 总结来说...

    在使用showModalDialog中为解决刷新时弹出新窗口时用到iframe所带来的一个问题

    在提供的压缩包文件"iframe_showModalDialog"中,可能包含了示例代码或文章,用于演示如何正确地结合`iframe`和`showModalDialog`以解决刷新时的窗口问题。通过研究这些资源,开发者可以获得更深入的理解,并解决...

    showModalDialog和open方法demo实例

    在`DialogDemo`这个实例中,可能包含了使用`showModalDialog`方法创建对话框的代码和相关HTML、CSS和JavaScript文件,供开发者学习和参考。通过查看和运行这些示例,你可以更好地理解这两个方法的用法和效果。在实际...

    解决showModalDialog 跨域 iframe

    在IT行业中,尤其是在Web开发领域,跨域问题是一个常见的挑战,特别是在使用特定的浏览器API时,比如`showModalDialog`。这个API允许开发者在当前页面上弹出一个模态对话框,显示另一个网页内容。然而,由于同源策略...

    showModalDialog(VS2008)示例

    4. `testpage`:这可能是项目中的一个页面文件,可能包含调用 `showModalDialog` 的 JavaScript 代码以及与数据库交互的 ASP.NET 代码。 在实际应用中,`showModalDialog` 可能会与 ASP.NET 的服务器端控件结合使用...

    window.showModalDialog的一个domo模型

    - 可能的JavaScript文件,如`script.js`,包含与`showModalDialog`相关的逻辑。 这个示例是学习和理解`window.showModalDialog`的一个很好的实践,它展示了如何在不同窗口之间进行通信,这对于创建复杂的交互式Web...

    showModalDialog和showModelessDialog的用法

    ### showModalDialog与showModelessDialog详解及应用案例 #### 一、showModalDialog与showModelessDialog的区别 **showModalDialog** 和 **showModelessDialog** 是JavaScript中用于创建弹出对话框的方法,它们在...

    'window.ShowModalDialog'在Chrome中不起作用

    标题 "window.ShowModalDialog在Chrome中不起作用" 涉及到的是JavaScript中一个特定的浏览器兼容性问题。`window.showModalDialog()` 是一个古老的JavaScript方法,用于在当前页面上打开一个模态对话框,该对话框...

    关于struts2里用javascript刷新window.showModalDialog的父页面

    同时,Struts2还提供了强大的拦截器机制,可以轻松地实现诸如文件上传/下载、国际化等功能。 #### JavaScript与Struts2的结合 在Struts2应用中,JavaScript主要用来处理前端的交互逻辑。例如,可以通过JavaScript...

    页面弹窗实现用的showModalDialog方法

    例如,在 `parent.htm` 文件中,通过 `showModalDialog` 打开 `modal.htm` 并传递一个对象,可以在 `modal.htm` 中通过 `window.dialogArguments` 访问到这个对象。 ### showModelessDialog 方法 `...

    Window.ShowModalDialog使用手册_对话框 .txt

    - 使用这些方法可能会带来安全性和兼容性问题,因此建议在现代 Web 开发中寻找替代方案。 - 对于需要跨浏览器兼容的项目,可以考虑使用 JavaScript 模态库(例如 Bootstrap Modal 或 jQuery UI Dialog)来实现类似...

    js showModalDialog 弹出对话框的简单实例(子窗体)

    这是在***应用程序中编写的网页代码,表明了页面文件的类型以及继承的代码后端类。之后,我们看到了HTML文档的头部和脚本部分。 在标签中,定义了两个函数:loadl和retu_value。这两个函数分别用于初始化对话框和...

    JavaScript中window.showModalDialog()用法详解

    - `sURL` 是一个字符串参数,用于指定对话框所要显示的HTML文件的URL。 - `vArguments` 是可选参数,允许你向对话框传递参数。这些参数可以是各种类型,比如数组、对象等。 - `sFeatures` 同样是可选参数,它是一个...

    JavaScript常用的窗口函数(showModalDialog,open,confirm)

    `confirm`常用于需要用户确认关键操作的情况,如删除文件或提交重要数据。 在实际开发中,这些函数常常结合使用,例如通过`open`创建新窗口,然后在新窗口中使用`showModalDialog`展示更复杂的交互,或者在用户进行...

    获取showModalDialog对话框中网页的IHTMLDocument2对象

    没办法获取showModalDialog对话框中网页的内容... 翻阅了大量的资料终于用Windows API实现了.. 这是个工程,里面有个导出函数,需要传入当前IE窗口句柄 然后传入IHTMLDocument2对象的引用。源代码在此供大家参考 环境...

Global site tag (gtag.js) - Google Analytics