Невозможно загрузить из модального диалога, window.showModalDialog - PullRequest
3 голосов
/ 24 ноября 2010

Я не могу загрузить файл со страницы aspx, если страница aspx открывается в модальном всплывающем окне с помощью window.showModalDialog ().

У меня есть кнопка с изображением на странице aspx, при нажатии на неефайл Excel был создан с использованием некоторой бизнес-логики, а затем я добавляю его в заголовок ответа, чтобы сделать этот файл доступным для загрузки.Код, как показано ниже,

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, я открыл другую страницу aspx, например Download.aspx, используя window.open и установил заголовки repsonse для события загрузки страницы в Download.aspx.Код, как показано ниже,

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 :).Да, этот подход работает на сервере разработки ASP.NET, но не работает на IIS.

Есть идеи, как заставить загрузку работать в модальных всплывающих окнах?

1 Ответ

0 голосов
/ 28 декабря 2012

Я просто боролся с этим. Я добавил файл .ashx для обработки кода. Вот что я сделал.

Это будет выполняться в коде модального окна, не закрывая его и не вызывая ошибку:

Sub DownloadFile()

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

End Sub

Затем добавьте код в ProofOfDeliveryDocs.ashx для обработки ответа ():

(Замените 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 #, если используете. Надеюсь, это поможет!

...