ASP.我可以强制下载存储的文件并在同一个事件处理程序中更新标签吗?
本文关键字:程序 事件处理 同一个 更新 标签 我可以 下载 存储 文件 ASP | 更新日期: 2023-09-27 18:09:37
我有一个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;
}
您的请求不能给出两个不同的响应。它不能同时响应页面更改和提供文件。
有几个选项可用。
-
在JavaScript中使用
window.open
打开一个文件处理程序窗口,该窗口将在页面返回之前启动下载。下载将在另一个窗口开始,然后您可以在post back中更新标签。 -
首先使用AJAX调用更新标签,然后在AJAX调用成功后,发回并执行文件下载。