Asp: прогресс не заканчивает анимацию, когда файл загружается из файла Ashx

Я пытаюсь использовать asp:progress, поэтому, когда я нажимаю на кнопку asp:, он вызывает файл Ashx, который пишет CSV-ответ.

До сих пор, когда я нажимаю на кнопку, анимация отображается правильно и начинается загрузка. Однако я не могу остановить анимацию, когда начинается загрузка файла (когда я получаю ответ из файла Ashx).

Вот aspx:

<asp:Content ID="Content2" ContentPlaceHolderID="MainPlaceHolder" runat="server">
 <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
        <ContentTemplate>
            <p>Download a CSV file</p>
            <asp:Button ID="Button2" runat="server" Text="Download" 
            CausesValidation="False" onclick="Button2_Click" />
        </ContentTemplate>
    </asp:UpdatePanel>

    <asp:UpdateProgress ID="UpdateProgress1"  AssociatedUpdatePanelID="UpdatePanel1" runat="server">
        <ProgressTemplate>
            <div id="AlertDiv" style="background:White">
                <asp:Image ID="imgLoading" runat="server" ImageUrl="css/smoothness/images/animated-overlay.gif" Width="34px" />Loading...
            </div>
        </ProgressTemplate>
    </asp:UpdateProgress>
</asp:Content>

Вот функция Button2_click:

protected void Button2_Click(object sender, EventArgs e)
{
    try
    {
        Response.Redirect("ProductsHierarchyDownload.ashx");
    }
    catch (Exception ex)
    {
      //log
    }
}

А вот функция ProcessRequest из файла ashx:

public void ProcessRequest(HttpContext context)
{
    string attachment = String.Format("attachment; filename=Hierarchie des produits au {0}.csv", DateTime.Today.ToShortDateString());
    context.Response.AddHeader("content-disposition", attachment);
    context.Response.ContentType = "text/csv";
    context.Response.AddHeader("Pragma", "public");
    context.Response.ContentEncoding = Encoding.GetEncoding(1252);
    context.Response.Write(DemandeTarifImageBLL.DataTableToCSVString());
}

Я пытался использовать javascript и свойство endRequest, beginRequest и событие initializeRequest класса PageRequestManager (я нашел здесь фрагмент conde), но пока у меня ничего не получалось.

Как заставить анимацию остановиться, когда начнется загрузка?

3 ответа

Попробуйте перенаправить на Ashx из JavaScript.

ScriptManager.RegisterClientScriptBlock(this, typeof(Page), "downloadFileExport", "javascript:window.location ='" + ResolveUrl(downloadUrl) + "';", true)

Это тоже решило мою проблему.

Хотя я не смог проверить, работает ли он, но по своему опыту я могу предложить следующее. Попробуйте изменить свой код следующим образом:

public void ProcessRequest(HttpContext context)
{
    string attachment = String.Format("attachment; filename=Hierarchie des produits au {0}.csv",        
    DateTime.Today.ToShortDateString());
    context.Response.AddHeader("content-disposition", attachment);
    context.Response.ContentType = "text/csv";
    context.Response.AddHeader("Pragma", "public");
    context.Response.ContentEncoding = Encoding.GetEncoding(1252);
    context.Response.Write(DemandeTarifImageBLL.DataTableToCSVString());
    context.Response.Flush();
    context.Response.End();
}

Добавление Flush и End очищает буфер и помечает конец ответа соответственно. Таким образом, клиент пришел бы к определенному заключению, что Запрос был полностью обработан.

Также вы можете контролировать ход обновления с помощью скрипта на стороне клиента, вот пример кода:

var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(EndRequest);

function EndRequest(sender, args) {
            if (postBackElement.id == 'Panel1Trigger') {
                $get('UpdateProgress1').style.display = 'none';
            }
        }

Приведенный выше js-код добавляет обработчик для события завершения запроса на панели обновления, а функция закрывает процесс обновления.

Попробуйте поместить содержимое вашей функции ProcessRequest вашего гендлера в событие нажатия кнопки, и не забудьте добавить функции Flush() и End для ответа.

РЕДАКТИРОВАТЬ 1:

Посмотрев дальше в переполнении стека, я обнаружил следующую ссылку с проблемой, похожей на вашу, и это подтвердило мое предположение о том, что вы не можете иметь перенаправление внутри панели обновления:

asp: UpdateProgress никогда не исчезает после нажатия на загружаемый контент внутри ретранслятора

Надеюсь это поможет.

В моем приложении ASP.Net Web Forms текст прогресса отображался даже после завершения процесса. Я смог исправить это в среде Dev, увеличив время ожидания в ScriptManager. Пример ниже.

Другие вопросы по тегам