2011-12-22 118 views
2

在一個MVC項目中,我有一個ActionLink,點擊後可以獲取與用戶關聯的任意數量的對象(作爲List提供),動態創建對象屬性的CSV文件並提示下載。該文件不應該保留在服務器上,因此它可能需要在下載後被刪除,或者下載需要來自流或類似文件。這是怎麼回事?我見過這種手動編譯CSV字符串並在控制器中使用HttpResponse.Write(String)的示例,但這是最佳做法嗎?動態CSV文件下載

回答

4

我有一個類似於這個的功能。我確定有一種「更好」的方法可以自動找到你傳遞的用戶對象的每個成員,但這種方式很有效。

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"); 
     } 
    } 
+0

此外,此方法假設每個屬性都是一個簡單的字符串,其中沒有逗號 – Brandon 2011-12-22 19:01:58

0

你應該手工組裝一個字符串,然後return Content(str, "text/csv");

0

LINQ to CSV據報道是一個很好的庫,用於生成CSV內容。生成CSV後,請使用ControllerFile方法從您的操作中返回FileStreamResult;它允許您發送任意任意流作爲響應,無論是FileStreamResult還是任何其他類型的Stream