Проблемы с созданием CSV для скачивания - PullRequest
1 голос
/ 24 августа 2010

Используя этот прекрасный пример Я получаю несколько забавных результатов. Что у меня есть:

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

Но происходит то, что CSV-файл содержит HTML-вывод со страницы, а также CSV-данные из CsvHelper. Что дает?

Ответы [ 2 ]

2 голосов
/ 24 августа 2010

При нажатии btnCSV ваш метод обработчика событий отправляет данные CSV в буфер ответов. Но как только метод завершает выполнение, остальная часть жизненного цикла страницы продолжается, отправляя обычную разметку страницы в буфер ответов. Вот почему к CSV добавлен HTML.

Чтобы предотвратить это, вам нужно завершить запрос, как только будут сгенерированы данные CSV. Вы, вероятно, захотите позвонить Application.CompleteRequest или подобному после вашего ProduceCSV вызова.

Редактировать ...

После просмотра документации, а не использования моей памяти, кажется, что объект HttpApplication не отображается на стандартной странице ASP.NET, и в этом случае вам, вероятно, придется использовать Response.End вместо. Не идеально, но сработает.

1 голос
/ 24 августа 2010

После клика вы хотите показать обычную страницу + предложить созданный вами файл, да? Есть небольшая разница: используйте attachtment вместо inline.

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