所以我在gridview中有一个按钮。如果用户单击该按钮,则发送rowcommand并将pdf文件下载/写入响应。
代码
HttpResponse httpResponse = Response;
httpResponse.Clear();
httpResponse.ContentType = "application/pdf";
httpResponse.AddHeader("content-disposition", $"attachment;filename={rowData.Pod.fileName}");
httpResponse.Output.Write(bytes);
Response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();
出于某种原因,我在尝试下载文件时总是Server cannot set content type after HTTP headers have been sent.
。现在gridview位于更新面板中,但这不应该是一个问题,因为其他按钮用于下载工作。
在我下载文件之前,我还尝试将缓冲区发送到true,但这并没有改变它。
修改
问题是我在“selectindexchanged”上设置了一个异步回发。 gridview的显示模式。有什么方法可以解决这个问题吗?当我更改触发器时,整个页面会在显示模态和重新生成之前重新加载。将文件更改为回发而不是asyncpostback
后,文件会下载答案 0 :(得分:1)
我有一个与此极为相似的问题。我在ListView控件中有一个按钮,试图打印pdf报告。经过广泛的研究,我发现了一个非常简单的解决方案。
将OnInit="btnPrint_Init"
添加到页面正面的按钮,然后将以下内容添加到后面的代码中(更改按钮名称以满足您的需要):
protected void btnPrint_Init(object sender, EventArgs e)
{
Button btnPrint = (Button)sender;
ScriptManager.GetCurrent(this).RegisterPostBackControl(btnPrint);
}
答案 1 :(得分:0)
可能,Response.Buffer是假的。
您应该在编写标题后编写内容。
httpResponse.ContentType = "application/pdf";
httpResponse.AddHeader("content-disposition", $"attachment;filename={rowData.Pod.fileName}");
httpResponse.Output.Write(bytes);
实际上,您可以将JavaScript命令设置为请求http处理程序的按钮,这是下载文件的最佳做法。
出于安全原因,您可以创建一个guid并将guid放入每行的会话项(将文件ID作为值),然后将该guid发送到http处理程序并从会话和响应二进制写入中检索文件ID文件