ASP.NET:我可以强制下载存储文件并在同一事件处理程序中更新标签吗?

时间:2011-09-26 20:02:23

标签: c# asp.net download response

我有一个ListView数据源到一个数据库,显示了要下载的文件列表以及每个文件的下载次数。在ItemTemplate中,我使用Label来显示当前计数和一个LinkBut​​ton,并将其Text设置为文件名,并将Command设置为“select”,以便触发Listviews SelectedIndexChanging事件。所有这一切工作正常,我可以强制下载对话框出现,但无法更新标签(这表示新的下载计数)。 我怀疑因为我正在使用Response来下载二进制数据,它会丢失所有信息以更新标签......我想有的是在下载文件之前保存响应流然后将其恢复到原始状态并尝试更新ItemTemplates标签。

   protected void FileListView_SelectedIndexChanging( Object sender, ListViewSelectEventArgs e )
   {
        ListViewItem item = (ListViewItem)PresetUploadListView.Items[e.NewSelectedIndex];
        LinkButton lb = (LinkButton)item.FindControl( "PresetUploadTitle" );
        int fileID = Convert.ToInt32( lb.CommandArgument.ToString( ), 10 );

        byte[] fileData = GetFileDataFromDatabasePreset(fileID);
        try
        {
            Response.ClearContent();
            Response.AddHeader("Content-Disposition", "attachment; filename=" + lb.Text + ".zip");
            BinaryWriter bw = new BinaryWriter(Response.OutputStream);
            bw.Write(fileData);
            bw.Close();
            Response.ContentType = "application/zip";
            Response.Flush();
            //Response.Close();
            //Response.End();
        }
        catch (Exception ex)
        {
            String s = ex.Message + " " + ex.InnerException;
        }
        Label l = (Label)item.FindControl("PresetUploadDownloads");
        int downloadCount = IncandreturnDownloadCount(fileID);
        l.Text = downloadCount.ToString(); //+> not getting updated...

        e.Cancel = true;
   }     

1 个答案:

答案 0 :(得分:1)

您的请求无法提供两种不同的回复。它无法响应页面更改并同时提供文件。

有几种选择。

  1. 在JavaScript中使用window.open打开文件处理程序的窗口,该窗口将在页面回发之前启动下载。下载将在另一个窗口中开始,然后您在帖子中更新标签。

  2. 首先使用AJAX调用更新标签,然后在AJAX调用成功时更新标签,回发并执行文件下载。