Обновить страницу после загрузки файла

Я собрал загрузку script после замечательной помощи на другой день. Однако я обнаружил, что после того, как файл был загружен, мне нужно перезагрузить страницу, чтобы избавиться от шаблона прогресса на странице aspx. Код для удаления шаблона работал до того, как я добавил в код загрузки.

Код для удаления шаблона прогресса: upFinanceMasterScreen.Update();

Я пробовал называть это до и после перенаправления на IHttpHandler

Response.Redirect("Download.ashx?ReportName=" + "RequestingTPNLeagueTable.pdf");


public class Download : IHttpHandler {

public void ProcessRequest(HttpContext context)
{    

   StringBuilder sbSavePath = new StringBuilder();
   sbSavePath.Append(DateTime.Now.Day);
   sbSavePath.Append("-");
   sbSavePath.Append(DateTime.Now.Month);
   sbSavePath.Append("-");
   sbSavePath.Append(DateTime.Now.Year);

    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.ContentType = "application/pdf";
    HttpResponse objResponce = context.Response;
    String test = HttpContext.Current.Request.QueryString["ReportName"];
    HttpContext.Current.Response.AppendHeader("content-disposition", "attachment; filename=" + test);
    objResponce.WriteFile(context.Server.MapPath(@"Reports\" + sbSavePath + @"\" + test));    

}
 public bool IsReusable { get { return true; } } 

Спасибо за любую помощь, которую вы можете предоставить!

Ответ 1

Когда вы отправляете обратно файл для загрузки пользователю, то есть HTTP-запрос. Другими словами, вы можете либо иметь пост-обратно, который обновляет страницу браузера или, вы можете отправить файл для загрузки пользователем. Вы не можете обойтись без особых трюков.

Вот почему большинство сайтов при загрузке файла сначала переносят вас на новую страницу, в которой говорится: "Ваша загрузка вот-вот начнется", а затем "перенаправляет" вас в файл для загрузки с использованием метаобновления или javascript.

Например, когда вы загружаете среду выполнения .NET 4:

http://www.microsoft.com/downloads/en/confirmation.aspx?FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true

Он отображает страницу, а затем использует следующий тег meta-refresh, чтобы фактически предоставить пользователю файл для загрузки:

<META HTTP-EQUIV="refresh" content=".1; URL=http://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x86_x64.exe" />

Вам, вероятно, придется сделать что-то подобное в своем приложении. Однако, если вы действительно заинтересованы в том, чтобы что-то делать после того, как файл полностью загружен, вам не повезло, так как нет никакого события, чтобы сообщить об этом браузеру. Единственный способ сделать это - AJAX upload, как gmail использует, когда вы загружаете вложение.

Ответ 2

В моем случае я использовал MVC, и я просто хотел, чтобы страница обновилась через несколько секунд после того, как была выбрана кнопка загрузки, чтобы показать новый счетчик загрузки. Я возвращал файл с контроллера.

Для этого я просто изменил представление, добавив событие onclick к кнопке загрузки, которая вызвала следующий скрипт (также в представлении):

setTimeout(function () {
        window.location.reload(1);
    }, 5000);

Это соответствует моей цели... надеюсь, что это помогает кому-то другому.

Ответ 3

Это быстро и легко взломать, если необходимо.

Шаг 1: добавьте скрытую кнопку на страницу.aspx:

<asp:Button ID="btnExportUploaded" runat="server" Text="Button" style="visibility:hidden"  OnClick="btnExportUploaded_Click" CssClass="btnExportUploaded" />

Шаг 2. Выполните действие postback по умолчанию и в конце зарегистрируйте сценарий запуска с вызовом jquery, который вызовет нажатие скрытой кнопки и приведет к загрузке файла:

ClientScriptManager cs = Page.ClientScript;
cs.RegisterStartupScript(this.GetType(), "modalstuff", "$('.btnExportUploaded').click();", true);

Ответ 4

Более простой подход заключается в том, чтобы делать все, что необходимо в событии PostBack, и регистрировать сценарий перезагрузки с дополнительным аргументом, указывающим загрузку. Что-то вроде:

Код С#:

protected void SaveDownloadCount(int downloadId)
{
    // Run in a PostBack event. 
    // 1) Register download count, refresh page, etc.
    // 2) Register a script with an additional parameter to indicate the dowbload
    Page.ClientScript.RegisterStartupScript(GetType(), "download",
        "$(document).ready(function(){window.location.href = window.location.pathname + '?printId={0}';});".Replace("{0}", downloadId.ToString()), true);
}

Затем, в PageLoad нам нужно проверить наличие PageLoad загрузки и подать файл:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            int printId;
            if (Request.QueryString["printId"] != null && int.TryParse(Request.QueryString["printId"], out printId))
            {
                // Check if the argument is valid and serve the file. 
            }
            else
            {
                // Regular initialization
            }
        }
    }

Это simalar для ответа @puddleglum, но без недостатка тайм-аута "вне синхронизации".