我不得不编写一个按钮,然后单击该按钮将csv文件下载到客户端的计算机上(这是一个Web应用程序)
所以,做了一些研究,把所有的字符串拉到一起,去了数字,它不起作用。
我现在想要解决这个问题:
protected void btnDownload_onClick(object sender, EventArgs e)
{
Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=tmp.csv");
Response.ContentType = "text/csv";
Response.Write("one,two,three,four,five");
Response.End();
}
根据google上发布的一篇博客,我只需要生成csv即可下载它。
只是,它不起作用,我无法弄清楚它有什么问题。
1)萤火虫检查:响应是空的。Response.End()
之后奇怪地停止,并抱怨它无法找到内容。
我错过了什么吗? 非常感谢。非常。
编辑:我刚刚意识到了这一点,这是一个子页面,母版页中有一个更新面板。这可能是问题的原因吗?如果是这样,我怎么能取消这个子页面的ajax回发?
答案 0 :(得分:5)
阅读your comments并进行编辑,看起来您想从子页面中取消这一个按钮的ajax回发,并且您的更新面板位于母版页中,您无法访问它。
如果我有正确的详细信息,只需在您的子内容页面的PageLoad()上添加此代码:
ScriptManager sm = ScriptManager.GetCurrent(Page);
if (sm != null)
sm.RegisterPostBackControl(btnDownload);
//btnDownload = the button ID, just copied from your code.
这将强制整页回发,您的文件将被下载。
答案 1 :(得分:3)
我更喜欢在WebHandler .ashx文件上执行此操作。与您所在的主页分开。
<%@ WebHandler Language="C#" Class="Handler" %>
using System;
using System.Web;
public class Handler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.AddHeader("content-disposition", "attachment; filename=file.csv");
context.Response.ContentType = "text/csv";
context.Response.Write("1,2,3,4,5,6");
}
public bool IsReusable
{
get
{
return false;
}
}
}
答案 2 :(得分:0)
从我在您的代码中看到的内容来看,您似乎将该响应作为回发的一部分发送。我不知道你是使用WebForms(ASPX)还是MVC,但如果你使用的是传统的ASP.NET,你可以创建一个名为“CSV.aspx”的新页面,删除响应的整个HTML主体并执行类似的操作这样:
在CSV.aspx上:
<%@ Page Title="" Language="C#" AutoEventWireup="true"
CodeBehind="CSV.aspx.cs" Inherits="TestASPNET.CSV" %>
在代码隐藏(CSV.aspx.cs)上:
public partial class CSV : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.AddHeader("content-disposition", "attachment; filename=tmp.csv");
Response.ContentType = "application/octet-stream";
Response.Write("one,two,three,four,five");
}
}
另外,请注意ContentType不是text / csv。
答案 3 :(得分:0)
尝试在Response.Flush()
和Response.Write()
之间调用Response.End()
。另外,请勿使用<asp:Button
。使用指向不同页面(或更好的* .ashx处理程序)的<asp:HyperLinK
(或者甚至只是普通的<a href
锚点)来提供此响应。