11

我正在使用 MVC 3 我想动态创建一个 CSV 文件以供下载,但我不确定正确的面向 MVC 的方法。

在传统的 ASP.net 中,我会编写如下内容:

Response.ClearHeaders();
Response.ContentType = "text/csv";
Response.AddHeader("content-disposition", attachment;filename='Test.csv'");
Response.Write("1,2,3");
Response.End();

我已经查看了该ContentResult操作,但似乎我需要将结果创建为字符串,即

return Content(myData, "text/csv");

我想我可以构建一个字符串,但是由于这些文件可能有几千行长,这对我来说似乎效率低下。

有人能指出我正确的方向吗?谢谢。

4

4 回答 4

15

我找到了解决这个问题的一种可能的方法。您可以简单地定义操作方法以返回 EmptyResult() 并直接写入响应流。例如:

public ActionResult RobotsText() {
    Response.ContentType = "text/plain";
    Response.Write("User-agent: *\r\nAllow: /");
    return new EmptyResult();
}

这似乎没有任何问题。不知道它是如何'MVC'......

于 2011-09-02T17:38:28.610 回答
8

昨天我在类似的问题上花了一些时间,以下是正确的方法:

public ActionResult CreateReport()
{
    var reportData = MyGetDataFunction();
    var serverPipe = new AnonymousPipeServerStream(PipeDirection.Out);
    Task.Run(() => 
    {
        using (serverPipe)
        {
             MyWriteDataToFile(reportData, serverPipe)
        }
    });

    var clientPipe = new AnonymousPipeClientStream(PipeDirection.In,
             serverPipe.ClientSafePipeHandle);
    return new FileStreamResult(clientPipe, "text/csv");
}
于 2015-06-05T15:54:40.987 回答
3

尝试返回一个FileResult:http: //msdn.microsoft.com/en-us/library/system.web.mvc.fileresult.aspx

另请参阅此示例:http ://forums.asp.net/t/1491579.aspx/1

于 2011-08-23T18:46:07.243 回答
-2

尝试这样的事情:

public ActionResult CreateReport(string report, string writer)
{
    var stream = new MemoryStream();
    var streamWriter = new StreamWriter(stream);

    _generateReport.GenerateReport(report, writer);

    streamWriter.Flush();
    stream.Seek(0, SeekOrigin.Begin);

    return new FileStreamResult(stream, writer.MimeType);
}
于 2013-10-02T16:18:05.483 回答