我正在使用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");
我想,我可以建立一个字符串,但由于这些文件可能有几千行长,我认为这似乎效率不高。
谁能给我指出正确的方向? 谢谢,我用的是MVC 3 I。
昨天我花了一些时间研究了类似的问题,这里有一个正确的方法。
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");
}
我发现了一个解决这个问题的方法。 你可以简单的定义动作方法返回一个EmptyResult(),直接写到响应流中。比如说
public ActionResult RobotsText() {
Response.ContentType = "text/plain";
Response.Write("User-agent: *\r\nAllow: /");
return new EmptyResult();
}
这样做似乎没有任何问题 不知道它是如何 "MVC "的...。
试试返回一个 FileResult
s: http:/msdn.microsoft.comen-uslibrarysystem.web.mvc.fileresult.aspx。
试试这样的东西。
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);
}