无法从模态对话框,window.showModalDialog下载

时间:2010-11-24 07:20:02

标签: asp.net download modal-dialog self showmodaldialog

如果使用window.showModalDialog()在模态弹出窗口中打开aspx页面,则无法从aspx页面下载文件。

我在aspx页面上有一个图像按钮,点击它后,通过使用一些业务逻辑生成了一个Excel文件,然后我将它添加到Response头以使该文件可供下载。代码如下所示,

Protected Sub ibtnExport_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles ibtnExport.Click
    ...
    Some business logic to generate excel file.
    ...

    Response.ClearHeaders()

    Response.ContentType = "application/ms-excel"
    Response.AddHeader("content-disposition", "attachment; filename=" + someXLSFile )
    Response.TransmitFile(someXLSFileWithPath)
    Response.Flush()
    HttpContext.Current.ApplicationInstance.CompleteRequest()

End Sub

当我以模态弹出方式打开此aspx页面时,它不会显示浏览器的下载窗口。在正常情况下(无模式,使用window.open打开)弹出下载工作正常。

我也尝试过使用其他方法下载文件。我没有在ibtnExport_Click中设置响应头,而是使用window.open打开了另一个aspx页面,例如Download.aspx,并在Download.aspx的页面加载事件上设置了repsonse标题。代码如下所示,

Protected Sub ibtnExport_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles ibtnExport.Click
    ...
    Some business logic to generate excel file.
    ...

    Session("$FileToDownload$") = someXLSFileWithPath    
    ClientScript.RegisterStartupScript(GetType(String),"download","window.open('Download.aspx')",true)

End Sub

在Download.aspx中,

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim filetoDownload As String = CType(Session("$FileToDownload$"), String)
    Dim fileName As String = System.IO.Path.GetFileName(filetoDownload)

    Response.ClearHeaders()
    Response.ContentType = "application/ms-excel"
    Response.AddHeader("content-disposition", "attachment; filename=" + fileName)
    Response.TransmitFile(filetoDownload)
    Response.Flush()
    HttpContext.Current.ApplicationInstance.CompleteRequest()        
End Sub

嗯,它适用于模态和无模式弹出窗口,并且在IIS上部署应用程序之前提供了一个relife :)。是的,这种方法适用于ASP.NET开发服务器,但不适用于IIS。

任何想法,使下载工作在模态弹出窗口?

1 个答案:

答案 0 :(得分:0)

我正在努力解决这个问题。我添加了一个.ashx文件来处理代码。这就是我所做的。

这将在模态窗口代码中运行而不关闭它或导致错误:

Sub DownloadFile()

    'use the ashx handler file to download the file
    Response.Redirect("~/Dispatch/ProofOfDeliveryDocs.ashx?id=" & lstDocuments.SelectedValue)

End Sub

然后在ProofOfDeliveryDocs.ashx中添加代码来处理Response()内容:

(将doc.DocumentName替换为您的文件,我确定您仍然想到了这一点)

Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest

    Dim doc As DeliveryDoc = New DeliveryDoc

    If Not context.Request.QueryString("id") = Nothing Then

        doc = doc.GetDeliveryDoc(context.Request.QueryString("id")) 'get the file

        context.Response.Clear()
        context.Response.ContentType = "application/x-unknown"
        context.Response.AppendHeader("Content-Disposition", "attachment; filename=" & doc.DocumentName)
        context.Response.BinaryWrite(doc.FileData.ToArray)

    End If

End Sub

这是VB代码,但是如果你使用的话,你应该可以很容易地翻译成C#。希望这有帮助!