2010-11-24 31 views
3

Je ne suis pas en mesure de télécharger un fichier à partir d'une page aspx si la page aspx est ouverte dans une fenêtre modale en utilisant window.showModalDialog(). J'ai un bouton image sur la page aspx, un clic sur un fichier Excel a été généré en utilisant une logique métier, puis je l'ajoute à l'en-tête Response pour rendre ce fichier disponible au téléchargement. Le code est comme indiqué ci-dessous,Impossible de télécharger à partir du dialogue modal, window.showModalDialog

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 

Quand j'ouvre cette page ASPX comme un pop up modal il ne montre pas la fenêtre de téléchargement du navigateur. Dans le cas d'un téléchargement contextuel normal (modélisé, ouvert en utilisant window.open), le téléchargement fonctionne correctement.

J'ai également essayé d'utiliser une autre approche pour télécharger des fichiers. Au lieu de définir l'en-tête de réponse dans ibtnExport_Click, j'ai ouvert une autre page aspx, dites Download.aspx, en utilisant window.open et définissez les en-têtes repsonse sur l'événement de chargement de page de Download.aspx. Le code est comme indiqué ci-dessous,

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 

Et 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 

Eh bien, cela fonctionne dans le cas des deux modes, ainsi que pop-up et modales donne une relife jusqu'à ce que vous déployez l'application sur IIS :). Oui, cette approche fonctionne sur le serveur de développement ASP.NET mais ne fonctionne pas sur IIS. Des idées pour que le téléchargement fonctionne sur les fenêtres pop-up modales?

+0

Je suppose que vous avez sur votre page, il vous suffit de définir la cible de votre lien hypertexte à _blank. – cstruter

Répondre

0

Je luttais juste avec ceci. J'ai ajouté un fichier .ashx pour gérer le code. Voici ce que j'ai fait.

Cela se déroulera dans le code de fenêtre modale sans fermer ou provoquer l'erreur:

Sub DownloadFile() 

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

End Sub 

Ajoutez ensuite le code dans ProofOfDeliveryDocs.ashx pour gérer la substance de réponse():

(Remplacer doc. documentname avec votre dossier, je suis sûr que vous avez compris que de toute façon si)

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 

Ce code est VB mais vous devriez être en mesure de traduire en C# assez facilement si vous utilisez. J'espère que cela t'aides!