Asp.net-Mvc

使用 CSVHelper 將流輸出到瀏覽器

  • January 13, 2014

我正在嘗試使用 CSVHelper 生成 CSV 文件並將其發送回瀏覽器,以便使用者可以選擇保存位置和文件名並保存數據。

該網站基於MVC。這是我用來進行呼叫的 jQuery 按鈕程式碼(數據是 DTO 列表的一些序列化 Json 表示):

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

這是控制器程式碼:

   [HttpPost]
   public FileStreamResult ExportPayments()
   {
       MemoryStream ms = new MemoryStream();
       StreamWriter sw = new StreamWriter(ms);
       CsvWriter writer = new CsvWriter(sw);

       List<Payment_dto> pd = _commonService.GetPayments();

       foreach (var record in pd)
       {
           writer.WriteRecord(record);
       }
       sw.Flush();

       return new FileStreamResult(ms, "text/csv");
   }

這似乎什麼也沒做——將方法步驟呼叫到正確的程式碼位中,但響應為空,更不用說為使用者提供文件對話框來保存數據了。我已經單步執行了這段程式碼,它從服務中取回數據,寫入數據,並且沒有拋出任何錯誤。那麼我做錯了什麼?

編輯:返回這個……

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

… 給我一個響應,由我期望的 csv 格式的數據組成。但是瀏覽器似乎仍然不知道如何處理它 - 沒有向使用者提供下載選項。

試試下面的程式碼:

   public FileStreamResult  ExportPayments()
   {
       var result = WriteCsvToMemory(_commonService.GetPayments()()); 
       var memoryStream = new MemoryStream(result);
       return new FileStreamResult(memoryStream, "text/csv") { FileDownloadName = "export.csv" };
   }


   public byte[] WriteCsvToMemory(IEnumerable<Payment_dto> records)
   {
       using (var memoryStream = new MemoryStream())
       using (var streamWriter = new StreamWriter(memoryStream))
       using (var csvWriter = new CsvWriter(streamWriter))
       {
           csvWriter.WriteRecords(records);
           streamWriter.Flush();
           return memoryStream.ToArray();
       }
   }

更新

下面是如何將復雜類型模型傳遞給使用GETHTTP 方法的操作方法。我不喜歡這種方法,它只是給你一個想法,有一種方法可以實現這一點。

模型

   public class Data
   {
       public int Id { get; set; }
       public string Value { get; set; }

       public static string Serialize(Data data)
       {
           var serializer = new JavaScriptSerializer();
           return serializer.Serialize(data);
       }
       public static Data Deserialize(string data)
       {
           var serializer = new JavaScriptSerializer();
           return serializer.Deserialize<Data>(data);
       }
   }

行動:

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

看法:

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

引用自:https://stackoverflow.com/questions/21093150