2009-12-10 9 views
4

J'ai la question suivante: J'ai une application MVC, dans une action de certains contrôleur je suis générer un fichier PDF, le fichier est généré sur un chemin spécifique sur le serveur. Cette action est appelée sur un lien d'action de la vue, lorsque l'utilisateur clique sur ce lien, l'action générée ce PDF, tout va bien jusqu'à ici. Je veux la page pour afficher la boîte de dialogue avec mon fichier PDF généré, qui dit:MVC ouvrir le fichier pdf

Ouvrir - Enregistrer - Annuler (la boîte de dialogue de fichier tipical lorsque vous cliquez sur un fichier)

Mais sans rafraîchir la page, afficher uniquement les boîte de dialogue lorsque l'utilisateur a cliqué sur le lien.

Comment est-ce que je pourrais faire cela? qu'est-ce que l'action devrait retourner à la vue? Merci.

Répondre

3

Fournir l'Open - Enregistrer - dialogue Annuler vous devez définir les en-têtes de réponse appropriés, et comme le dit @RichardOD, retourner un FilePathResult ou FileStreamResult.

HttpContext.Response.AddHeader("content-disposition", "attachment; 
           filename=form.pdf"); 

return new FileStreamResult(fileStream, "application/pdf"); 
+0

'' FileStreamResult' et FilePathResult' ont tous deux une propriété 'FileDownloadName', que vous devriez utiliser au lieu de m en définissant l'en-tête '" content-disposition "'. –

0

Essayez quelque chose comme ça

public class PdfResult : ActionResult 
    { 
     //private members 
     public PdfResult(/*prams you need to generate that pdf*/) 
     public override void ExecuteResult(ControllerContext context) 
     { 
      //create the pdf in a byte array then drop it into the response 
      context.HttpContext.Response.Clear(); 
      context.HttpContext.Response.ContentType = "application/pdf"; 
      context.HttpContext.Response.AddHeader("content-disposition", "attachment;filename=xxx.pdf"); 
      context.HttpContext.Response.OutputStream.Write(pdfBytes.ToArray(), 0, pdfBytes.ToArray().Length); 
      context.HttpContext.Response.End(); 
     } 
    } 

Alors u retour juste un PdfResult

Astuce: Je suis une classe générique pour ce faire et il est quelque chose comme ça et je l'utilise NFop

public PdfResult(IQueryable source, Dictionary<string,int> columns, Type type) 
    { 
     Source = source; 
     Columns = columns; 
     SourceType = type; 
    } 
Questions connexes