2010-08-23 15 views
1

Utilisation de this lovely example Je reçois des résultats géniaux. Ce que j'est:Problème de création de csv à télécharger

Protected Sub btnCSV_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCSV.Click 

    Response.Clear() 
    Response.Buffer = True 
    Response.ContentType = "text/csv" 
    Response.AppendHeader("Content-Disposition", "inline; filename=" + FileName + ".csv") 

    CsvHelper.ProduceCSV(dt, Response.Output, True) 

End Sub 

Mais ce qui se passe est que le fichier csv contient la sortie HTML de la page, ainsi que les données de csv de la CsvHelper. Ce qui donne?

+0

Pouvez-vous m'expliquer pourquoi l'autre réponse est la bonne pour votre question et non la mienne? Juste par curiosité. – Jeroen

Répondre

2

Lorsque vous cliquez sur btnCSV, votre méthode de gestionnaire d'événements envoie les données CSV au tampon de réponse. Mais une fois la méthode terminée, le reste du cycle de vie de la page continue, envoyant le balisage de page normal au tampon de réponse. C'est pourquoi vous avez ajouté du code HTML au fichier CSV.

Pour éviter cela, vous devez terminer la requête dès que les données CSV ont été générées. Vous voudrez probablement appeler le Application.CompleteRequest, ou similaire, après votre appel ProduceCSV.

Modifier ...

Après avoir pris un coup d'œil à la documentation, plutôt que de compter sur ma mémoire, il semble que l'objet HttpApplication ne soit pas exposé dans une page ASP.NET standard, auquel cas vous devrez probablement utiliser Response.End à la place. Pas idéal, mais ça va faire l'affaire.

1

Après le clic, vous voulez afficher la page normale + offrir le fichier que vous avez créé, oui? Il y a une légère différence: utilisez attachtment au lieu de inline.

Response.ContentType = "application/octet-stream" 
Response.AddHeader("Content-Disposition", _ 
    "attachment; filename=""" & filename & """")