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



我有一个ListView数据源到一个数据库,显示要下载的文件列表以及每个文件的下载计数。在ItemTemplate中,我使用Label来显示当前计数和LinkButton,其文本设置为文件名,命令设置为"select",以便触发Listviews SelectedIndexChanging事件。这一切都很好,我可以强制下载对话框出现,但不能得到标签更新(这表明新的下载计数)。我怀疑,因为我使用响应下载二进制数据,它失去了所有的信息来更新标签…我的一个想法是在下载文件之前保存响应流,然后将其恢复到原始状态,并尝试更新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. 在JavaScript中使用window.open打开一个文件处理程序窗口,该窗口将在页面返回之前启动下载。下载将在另一个窗口开始,然后您可以在post back中更新标签。

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

最新更新