Перенаправление на другую страницу после ответа.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 6

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 через сеанс.

Я добавил target="_blank" к ссылке, которая ведет меня на страницу. Поэтому, когда он открывается в новом окне, он отправляет лист excel в браузер и закрывает страницу, поскольку ему больше нечего делать после Response.End();

Надеюсь, это поможет. Работать на меня.