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. Пример ниже.