C # Postback - установить текст на странице после отправки загрузки - PullRequest
0 голосов
/ 29 июня 2018

У меня есть форма, которая при отправке загружает сгенерированный CSV-файл. У меня есть asp: Literal на странице в качестве заполнителя для загрузки текста:

<div id="loading-text">
    <asp:Literal ID="litLoadingText" runat="server"></asp:Literal>
</div>

$("input[type=submit]").on("click", function() {
    //$(".loading-modal").show();
    $("#loading-text").html("Loading...");
});

и я пытаюсь изменить текст после завершения загрузки, чтобы сказать "Готово!" или просто удалить:

Response.Clear();
Response.Buffer = true;
var fileName = !String.IsNullOrEmpty(txtFileName.Value) ? txtFileName.Value : "ContentExport";
Response.AddHeader("content-disposition", String.Format("attachment;filename={0}.xls", fileName));
Response.Charset = "";
Response.ContentType = "application/vnd.ms-excel";
using (StringWriter sw = new StringWriter())
{
    Response.Output.Write(sw.ToString());
    Response.Flush();
    Response.End();

    litLoadingText.Text = "Done!";
}

но текст не меняется. Я почти уверен, что это из-за загрузки, где я делаю Response.End () и еще много чего, но я не уверен, как с этим справиться. Есть ли способ сделать это в C #, или есть метод Javascript, который я мог бы использовать вместо этого, чтобы определить, когда загрузка будет завершена? Какой будет лучший подход?

1 Ответ

0 голосов
/ 30 июня 2018

Проблема описана здесь: https://support.microsoft.com/en-us/help/312629/prb-threadabortexception-occurs-if-you-use-response-end-response-redir

Причина

Метод Response.End завершает выполнение страницы и переносит выполнение на событие Application_EndRequest в конвейере событий приложения. Строка кода, следующая за Response.End, не выполняется.

Эта проблема возникает в методах Response.Redirect и Server.Transfer, так как оба метода вызывают Response.End внутри.

Разрешение

Чтобы обойти эту проблему, используйте один из следующих методов:

Для Response.End вызовите метод HttpContext.Current.ApplicationInstance.CompleteRequest вместо Response.End, чтобы пропустить выполнение кода для события Application_EndRequest.

Для Response.Redirect используйте перегрузку Response.Redirect (String url, bool endResponse), которая передает значение false для параметра endResponse для подавления внутреннего вызова Response.End. Например:

Response.Redirect ("nextpage.aspx", false);

Если вы используете этот обходной путь, выполняется код, следующий за Response.Redirect.

Для Server.Transfer, используйте взамен Server.Executemethod.

...