我试图让用户单击网页上的按钮下载CSV文件,但在向用户发送正确的数据时遇到问题。此外,一旦下载了文件,我希望页面保持"活动"状态,即页面可以继续向服务器触发事件,例如再次单击下载按钮。
这是我目前使用的代码,由各种SO问题拼凑而成:
var sb = new StringBuilder();
string fileName = "data.csv";
// Build CSV file...
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.AddHeader("content-disposition", string.Format("filename={0}", fileName));
HttpContext.Current.Response.ContentType = "text/csv";
HttpContext.Current.Response.Write(sb.ToString());
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
这可以为用户提供打开或下载文件的选项,但该文件在请求的数据之后还包含aspx文件的整个标记,并且页面处于完全不活动状态。
我猜问题出在上面代码的最后两行。我尝试过使用ApplicationInstance.CompleteRequest
而不是Response.End
,但这似乎并没有改变结果。页面仍然处于非活动状态,文件的末尾仍然有标记。有人能帮忙吗?
如果Response
的行为有所不同,则该页面在SharePoint 2010中为WebPartPage
。
设置线路
HttpContext.Current.Response.AddHeader("content-disposition", "filename={0}", fileName));
至
HttpContext.Current.Response.AppendHeader("content-disposition", String.Format("attachment;filename={0}", fileName));
并在按钮上设置以下属性
downloadButton.OnClientClick = "_spFormOnSubmitCalled = false;";
_spFormOnSubmitCalled
是一个javascript变量,SharePoint使用它来停止多个表单提交,当您单击下载按钮时,它将被设置为true。
尝试这个
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename="" + fileName + """);
HttpContext.Current.Response.ContentType = "application/CSV";