无法获得c#来制作可下载的csv

时间:2011-06-23 17:17:43

标签: asp.net c#-4.0 csv response.write

我不得不编写一个按钮,然后单击该按钮将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)萤火虫检查:响应是空的。
2)VS调试,在行Response.End()之后奇怪地停止,并抱怨它无法找到内容。

我错过了什么吗? 非常感谢。非常。

编辑:我刚刚意识到了这一点,这是一个子页面,母版页中有一个更新面板。这可能是问题的原因吗?如果是这样,我怎么能取消这个子页面的ajax回发?

4 个答案:

答案 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锚点)来提供此响应。