【问题标题】:Update page after file download文件下载后更新页面
【发布时间】:2011-04-30 19:56:17
【问题描述】:

前几天,在堆栈溢出的一些出色帮助下,我整理了一个下载脚本。但是我现在发现,在下载文件后,我需要重新加载页面以摆脱 aspx 页面上的进度模板。在我添加下载代码之前,删除模板的代码有效。

移除进度模板的代码:upFinanceMasterScreen.Update();

我尝试在重定向到 IHttpHandler 之前和之后调用 put this

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; } } 

感谢您提供的任何帮助!

【问题讨论】:

    标签: c# asp.net ihttphandler


    【解决方案1】:

    当您发回一个文件供用户下载时,那个就是 HTTP 请求。换句话说,您可以或者有一个刷新浏览器页面的回发或者您可以发送一个文件供用户下载。如果没有特殊的技巧,你不能同时做到这两点。

    这就是为什么大多数网站在您下载文件时首先将您带到一个显示“您的下载即将开始”的新页面,然后将您“重定向”到使用元刷新或 javascript 下载文件。

    例如,当你去这里下载 .NET 4 运行时:

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

    它呈现页面,然后使用以下元刷新标记实际为用户提供要下载的文件:

    <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" />
    

    您可能必须在您的应用中执行类似的操作。但是,如果您真的有兴趣在 文件完全 下载后执行某些操作,那么您就不走运了,因为没有任何事件可以将其传达给浏览器。这样做的唯一方法是像 gmail 在您上传附件时使用的 AJAX upload

    【讨论】:

    • 谢谢!我不认为这是可能的,但只是想我会问。
    • 因为你不能同时拥有两个页面,为什么不使用两个页面来做呢!我的方法是更新然后弹出另一个页面(使用 JavaScript windows.open())来处理下载。您不妨查看Page.ClientScript.RegisterStartupScript。希望这对其他人有所帮助。
    【解决方案2】:

    就我而言,我使用的是 MVC,我只是希望在选择下载按钮后几秒钟刷新页面以显示新的下载计数。我正在从控制器返回文件。

    为此,我只是通过将 onclick 事件添加到调用以下脚本(也在视图中)的下载按钮来更改视图:

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

    它符合我的目的...希望对其他人有所帮助。

    【讨论】:

    • 感谢您的好方法。
    • 不错的解决方法,让我头疼。这不是一个花哨的解决方案,如果设置的延迟值小于下载所需的时间,则可能会出现问题,但即使使用 ASP.NET 网络表单控件也可以。
    • 在这种情况下,如果服务器处理您的请求的时间超过 5 秒,那么您的文件可能不会被下载。
    【解决方案3】:

    如果需要,这很容易破解。

    第 1 步: 将隐藏按钮添加到 .aspx 页面:

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

    第 2 步:执行您的默认回发操作,最后使用 jquery 调用注册一个启动脚本,这将触发隐藏按钮单击并导致文件下载:

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

    【讨论】:

      【解决方案4】:

      更简单的方法是在PostBack 事件中执行任何需要的操作,并注册一个带有附加参数的重新加载脚本以指示下载。 比如:

      C#代码:

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

      然后,在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
                  }
              }
          }
      

      这与@puddleglum 答案类似,但没有“不同步”超时的缺点。

      【讨论】:

        猜你喜欢
        • 2014-10-22
        • 2013-09-03
        • 2013-03-22
        • 2019-09-28
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        • 1970-01-01
        相关资源
        最近更新 更多