При нажатии btnCSV
ваш метод обработчика событий отправляет данные CSV в буфер ответов. Но как только метод завершает выполнение, остальная часть жизненного цикла страницы продолжается, отправляя обычную разметку страницы в буфер ответов. Вот почему к CSV добавлен HTML.
Чтобы предотвратить это, вам нужно завершить запрос, как только будут сгенерированы данные CSV. Вы, вероятно, захотите позвонить Application.CompleteRequest
или подобному после вашего ProduceCSV
вызова.
Редактировать ...
После просмотра документации, а не использования моей памяти, кажется, что объект HttpApplication
не отображается на стандартной странице ASP.NET, и в этом случае вам, вероятно, придется использовать Response.End
вместо. Не идеально, но сработает.