asp.net-mvc – 使用CSVHelper将流输出到浏览器

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 使用CSVHelper将流输出到浏览器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使用CSVHelper生成CSV文件并将其发送回浏览器,因此用户可以选择保存位置和文件名并保存数据。

该网站是基于MVC的。这里是我用来进行调用的jQuery按钮代码(数据是DTO列表的一些序列化的Json表示):

  1. $.ajax({
  2. type: "POST",url: unity.baseUrl + "common/ExportPayments",data: data
  3. });

这是控制器代码

  1. [HttpPost]
  2. public FileStreamResult ExportPayments()
  3. {
  4. MemoryStream ms = new MemoryStream();
  5. StreamWriter sw = new StreamWriter(ms);
  6. CsvWriter writer = new CsvWriter(sw);
  7.  
  8. List<Payment_dto> pd = _commonService.GetPayments();
  9.  
  10. foreach (var record in pd)
  11. {
  12. writer.WriteRecord(record);
  13. }
  14. sw.Flush();
  15.  
  16. return new FileStreamResult(ms,"text/csv");
  17. }

这似乎完全没有实现 – 将方法步骤调用到正确的代码位置,但响应为空,更不用说为用户提供文件对话框来保存数据。我已经通过了这个代码,并且从服务中返回数据,写入它,并且不会发生错误。那我做错了什么?

编辑:返回这个…

  1. return File(ms.GetBuffer(),"text/csv","export.csv");

…给我一个响应,包括我期望的csv格式的数据。但是浏览器似乎还不知道该怎么做 – 不会向用户提供下载选项。

解决方法

请尝试以下代码
  1. public FileStreamResult ExportPayments()
  2. {
  3. var result = WriteCsvToMemory(_commonService.GetPayments()());
  4. var memoryStream = new MemoryStream(result);
  5. return new FileStreamResult(memoryStream,"text/csv") { FileDownloadName = "export.csv" };
  6. }
  7.  
  8.  
  9. public byte[] WriteCsvToMemory(IEnumerable<Payment_dto> records)
  10. {
  11. using (var memoryStream = new MemoryStream())
  12. using (var streamWriter = new StreamWriter(memoryStream))
  13. using (var csvWriter = new CsvWriter(streamWriter))
  14. {
  15. csvWriter.WriteRecords(records);
  16. streamWriter.Flush();
  17. return memoryStream.ToArray();
  18. }
  19. }

更新

以下是将复杂类型模型传递给使用GET HTTP方法的动作方法。我不喜欢这种方法,它只是给你一个想法,有一种方法来实现这一点。

模型

  1. public class Data
  2. {
  3. public int Id { get; set; }
  4. public string Value { get; set; }
  5.  
  6. public static string Serialize(Data data)
  7. {
  8. var serializer = new JavaScriptSerializer();
  9. return serializer.Serialize(data);
  10. }
  11. public static Data Deserialize(string data)
  12. {
  13. var serializer = new JavaScriptSerializer();
  14. return serializer.Deserialize<Data>(data);
  15. }
  16. }

行动:

  1. [HttpGet]
  2. public FileStreamResult ExportPayments(string model)
  3. {
  4. //Deserialize model here
  5. var result = WriteCsvToMemory(GetPayments());
  6. var memoryStream = new MemoryStream(result);
  7. return new FileStreamResult(memoryStream,"text/csv") { FileDownloadName = "export.csv" };
  8. }

视图:

  1. @{
  2. var data = new Data()
  3. {
  4. Id = 1,Value = "This is test"
  5. };
  6. }
  7. @Html.ActionLink("Export","ExportPayments",new { model = Data.Serialize(data) })

猜你在找的asp.Net相关文章