5

我必须编写一个按钮,单击该按钮将 csv 文件下载到客户端的计算机上(这是一个网络应用程序)

所以,做了一些研究,把所有的弦都拉到一起,去想,它不起作用。

我现在正试图得到这个:

    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();
    }

根据谷歌上出现的博客,这就是我生成该 csv 并下载它所需的全部内容。

只是,它不起作用,我无法弄清楚它有什么问题。

1)萤火虫检查:响应为空。
2) VS Debugging,奇怪地停在行后Response.End(),抱怨找不到内容。

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

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

4

4 回答 4

6

阅读您的评论和编辑,看起来您想取消子页面中这个按钮的 ajax 回发,并且您的更新面板位于母版页中,您无法访问它。

如果我的详细信息正确,只需将此代码添加到您的子内容页面的 PageLoad() 中:

        ScriptManager sm = ScriptManager.GetCurrent(Page);
        if (sm != null)
            sm.RegisterPostBackControl(btnDownload); 
        //btnDownload = the button ID, just copied from your code.

这将强制全页回发,并且您的文件将被下载。

于 2011-06-23T17:49:38.500 回答
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;
        }
    }
}
于 2011-06-23T17:36:24.157 回答
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。

于 2011-06-23T17:34:09.020 回答
0

尝试Response.Flush()Response.Write()和之间调用Response.End()。另外,不要<asp:Button为此使用 an 。使用指向不同页面(或者更好的是 *.ashx 处理程序)的<asp:HyperLinK(甚至只是一个普通的锚点)会给出这个响应。<a href

于 2011-06-23T17:37:56.870 回答