Сообщение Назад не работает после писания файлов к ответу в ASP.NET

Что я имею?

У меня есть страница ASP.NET, которая позволяет пользователю загружать файл a на нажатии кнопки. Пользователь может выбрать файл, который он хочет от списка доступных файлов (RadioButtonList) и нажимает на кнопку загрузки для загрузки его. (Я не должен предоставлять ссылку для каждого файла, который может быть загружен - это - требование).

Что я хочу?

Я хочу, чтобы пользователь загрузил несколько файлов один за другим путем установки необходимого переключателя и нажатия на кнопку.

С какой проблемой я сталкиваюсь?

Я могу загрузить файл впервые правильно. Но, после загрузки, если я выбираю некоторый другой файл и нажимаю на кнопку для загрузки его, событие щелчка кнопки не отправляет назад, и второй файл не будет загружен.

Я использую следующий код на событии нажатия кнопки:

protected void btnDownload_Click(object sender, EventArgs e)
{
    string viewXml = exporter.Export();
    Response.Clear();
    Response.AddHeader("Content-Disposition", "attachment; filename=views.cov");
    Response.AddHeader("Content-Length", viewXml.Length.ToString());
    Response.ContentType = "text/plain";
    Response.Write(viewXml);
    Response.End();
}

Я делаю что-то не так здесь?

Та же проблема может копироваться в IE6, IE7 и Chrome. Я думаю, что этой проблемой является независимый браузер.

44
задан Mogsdad 13 October 2015 в 17:44
поделиться

2 ответа

Удалите Response.End () и позвольте ответу завершиться естественным образом в экосистеме ASP.NET.

Если это не сработает, я бы рекомендовал поместить кнопку в отдельный

и отправить необходимые данные в отдельный обработчик HTTP. Настройте обработчик HTTP для экспорта XML вместо веб-страницы.

3
ответ дан 26 November 2019 в 22:09
поделиться

Навскидку, то, что вы делаете, должно сработать. Раньше я успешно делал подобное, хотя использовал повторитель и кнопки LinkButton.

Единственное отличие, которое я вижу, это то, что вы используете Response.Write () , а не Response.OutputStream.Write () , и что вы пишете текстовый, а не двоичный, но, учитывая указанный вами ContentType , это не должно быть проблемой. Кроме того, я вызываю Response.ClearHeaders () перед отправкой информации и Response.Flush () после (до моего вызова Response.End () ).

Если это поможет, вот очищенная версия того, что у меня хорошо работает:

// called by click handler after obtaining the correct MyFileInfo class.
private void DownloadFile(MyFileInfo file) 
{
    Response.Clear();
    Response.ClearHeaders();
    Response.ContentType = "application/file";
    Response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.FileName + "\"");
    Response.AddHeader("Content-Length", file.FileSize.ToString());
    Response.OutputStream.Write(file.Bytes, 0, file.Bytes.Length);
    Response.Flush();
    Response.End();        
}

Вы можете рассмотреть возможность передачи файла двоичным способом, возможно, вызвав System.Text.Encoding.ASCII.GetBytes (viewXml); и передача результата в Response.OutputStream.Write () .

Небольшое изменение кода:

protected void btnDownload_Click(object sender, EventArgs e)
{
    string viewXml = exporter.Export();
    byte [] bytes = System.Text.Encoding.ASCII.GetBytes(viewXml); 
    // NOTE: you should use whatever encoding your XML file is set for.
    // Alternatives:
    // byte [] bytes = System.Text.Encoding.UTF7.GetBytes(viewXml);
    // byte [] bytes = System.Text.Encoding.UTF8.GetBytes(viewXml);

    Response.Clear();
    Response.ClearHeaders();
    Response.AddHeader("Content-Disposition", "attachment; filename=views.cov");
    Response.AddHeader("Content-Length", bytes.Length.ToString());
    Response.ContentType = "application/file";
    Response.OutputStream.Write(bytes, 0, bytes.Length);
    Response.Flush();
    Response.End();
}
4
ответ дан 26 November 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: