Перенаправление на другую страницу после ответа.End() был вызван в C#
Я экспортирую gridview в excel, используя .Net 4.0 в веб-приложении, при загрузке страницы и необходимости создания файла, а затем страницы для перенаправления на вызывающую страницу. Я сталкиваюсь с проблемами, потому что мой код для экспорта в excel выглядит следующим образом:
gvSummary.Style.Add("font-size", ".6em");
Response.Clear();
string attachment = "attachment; filename=filename.xls";
Response.ClearContent();
Response.AddHeader("content-disposition", attachment);
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
gvSummary.GridLines = GridLines.Horizontal;
gvSummary.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();
Я знаю, что если я поставлю ответ.Redirect() перед этим .End (), я получу перенаправление, но файл никогда не генерируется, и если я положу ответ.Redirect() после .End() я получаю файл, но без перенаправления.
Код, написанный выше, отлично работает при создании файла, однако, когда после создания файла я все еще застреваю, видя свою анимацию загрузки, потому что я не могу вырваться из страницы. Есть идеи?
6 ответов:
Я предлагаю добавить заголовок перенаправления. Что-то вроде этого:
Response.AddHeader("Refresh", "3; url=index.html");
Где 3-Время задержки и индекс.html-это url, который нужно перенаправить на
Проблема заключается в ответе.End() отправляет последние биты страницы клиенту для завершения запроса. В вашем случае запрос содержит файл.
Одним из возможных решений является открытие новой страницы для загрузки и сохранение перенаправления на текущей странице.
Вы не можете сделать оба открытия, поэтому вы можете попробовать установить ссылку на сгенерированный файл xls в новом окне или в качестве источника для iframe
В JavaScript:
function refresh() { document.location.reload(true); }
Кнопка:
<td valign="top" style=" width:100px "> <asp:Button runat="server" ID="btnX" Text="X" CssClass="ui-button ui-widget ui-state-default ui-corner-all ui-button-text ui-state-hover" OnClientClick="refresh();" Width="180px" /> </td>
Я попытался открыть отдельную страницу через ScriptManager, которая будет загружать мой файл, делая перенаправление на моей исходной странице.
Поэтому я добавил ниже код на моей главной странице:
string strScript = "<script language='javascript'> window.open('CommonDownload.aspx','Report');</script>"; ScriptManager.RegisterStartupScript(Page, this.GetType(), "clientScript", strScript, false); Response.Redirect("Page.aspx");
А затем добавил код загрузки в метод Page_Load моей страницы CommonDownload. Я передал часть необходимой мне информации на странице CommonDownload через сеанс.