Asp.net-Mvc
使用 CSVHelper 將流輸出到瀏覽器
我正在嘗試使用 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) })