在一个MVC项目中,我有一个ActionLink,当点击它时,它应该采用与用户相关的任意数量的对象(作为List提供),动态地构建对象的CSV文件。属性并提示下载。该文件不应该在服务器上持久存在,因此需要在下载后将其删除,或者下载需要来自流或类似文件。最新的解决方法是什么?我已经看过这样的示例,它手动编译CSV字符串并在控制器中使用HttpResponse.Write(String)
,但这是最佳做法吗?
答案 0 :(得分:4)
我有一个与此类似的功能。我确信有一种“更好”的方法来自动查找传递它的User对象的每个成员,但这种方式有效。
public ActionResult ExportCSV(List<User> input)
{
using (MemoryStream output = new MemoryStream())
{
using (StreamWriter writer = new StreamWriter(output, Encoding.UTF8))
{
foreach (User user in input)
{
writer.Write(user.firstattribute);
writer.Write(",");
writer.Write(user.secondattribute);
writer.Write(",");
writer.Write(user.thirdattribute);
writer.Write(",");
writer.Write(user.lastattribute);
writer.WriteLine();
}
writer.Flush();
}
output.Position = 0;
return Controller.File(output, "text/comma-separated-values", "report.csv");
}
}
答案 1 :(得分:3)
如果您有流,returning a FileStreamResult
可能是在ASP.NET MVC中“最干净”的方式。
答案 2 :(得分:0)
您应手动汇编字符串,然后return Content(str, "text/csv");
答案 3 :(得分:0)
LINQ to CSV是一个很好的用于生成CSV内容的库。生成CSV后,使用File
Controller
方法从您的操作中返回FileStreamResult
;这使得您可以将任意流作为响应发送,无论是FileStreamResult
还是任何其他类型的Stream
。